聚合物元素用getter / setter声明可绑定属性的最简单方法是什么?

时间:2014-05-27 22:51:52

标签: polymer

使用聚合物元素的attributes属性或publish块,可以非常轻松地创建自动管理其基础存储的属性。但是,通常会出现不仅仅存储和检索财产价值的情况。例如,属性的值可能取决于其他元素状态。另一个例子:一个可绑定但只读的属性。

在这种情况下,能够使用getter / setter对定义属性是很好的。但是,目前尚不清楚如何将结果属性声明为可绑定。如果属性名称包含在attributespublish中,则不会使用getter / setter。如果属性名称​​未声明,则它似乎不可绑定。由attributes / publish生成的默认属性行为仅支持onChanged处理程序;没有办法拒绝尝试设置属性(例如,在setter中),也没有办法在检索值时运行getter。

我认为这里的任何解决方案都需要放弃Polymer的声明性语法并从头开始构建。我对此进行了一次拍摄:http://jsbin.com/qejaf/2/edit。这是有效的,但我想知道是否有更简单的方法来做到这一点。例如,是否可以定义一个getter / setter(或只是getter)通过publish块公开它?

(旁白:在这个例子中有一点我希望能够引用一个命名的元素构造函数,但它似乎在ready期间不可用。)

2 个答案:

答案 0 :(得分:5)

几点:

  • 截至目前,您无法发布吸气剂,因为Polymer没有 支持它的机器。我们可能会在将来改进这一点,但它是 不太重要,因为你可以用计算机做类似的工作 属性和观察者。肯定有计划进行 一个正式的计算属性语法,这应该使事情更清楚。

  • 一般来说,你不应该试着观察一个吸气剂,因为(正如Jan 注意到)Object.observe无法知道值是否已经改变 (令人困惑的是,它经常在observe.js polyfill下工作,因为 脏检查;即便如此,脏检查吸气剂也是一个坏主意 因为吸气剂可能是任意昂贵的计算 [例如。可能会使用offsetWidth并强制重新设置样式]。

  • 不支持将可绑定属性设置为只读。 Polymer默认采用双向数据绑定方式采取了一种不寻常的方法。选择这种方法是为了减少开发人员的认知负荷(数据不会传播,所有绑定属性总是反映相同的值)。另一方面,观察副作用总是异步。在下面的jsbin中,我将count设置为只读,但仅限于它与任何尝试设置它的异步快照回私有值。

http://jsbin.com/qiboq/4/edit

答案 1 :(得分:2)

我无法弄清楚你的完整问题,但很容易使用具有发布属性的getter和聚合物中的属性请参考代码下面的示例

<polymer-element name="blog-element"  attributes="owner ownnerfullname">
<template >
  <div><span>{{owner}}</span></div>
      <div><span>{{ownnerfullname}}</span></div>
      </template>
 <script>
    Polymer('blog-element', {
       publish: {
        owner: 'I am foo!',
        get ownnerfullname(){return this.owner + "changes";}
      },


    });
  </script>
</polymer-element>