使用聚合物元素的attributes
属性或publish
块,可以非常轻松地创建自动管理其基础存储的属性。但是,通常会出现不仅仅存储和检索财产价值的情况。例如,属性的值可能取决于其他元素状态。另一个例子:一个可绑定但只读的属性。
在这种情况下,能够使用getter / setter对定义属性是很好的。但是,目前尚不清楚如何将结果属性声明为可绑定。如果属性名称包含在attributes
或publish
中,则不会使用getter / setter。如果属性名称未声明,则它似乎不可绑定。由attributes
/ publish
生成的默认属性行为仅支持onChanged处理程序;没有办法拒绝尝试设置属性(例如,在setter中),也没有办法在检索值时运行getter。
我认为这里的任何解决方案都需要放弃Polymer的声明性语法并从头开始构建。我对此进行了一次拍摄:http://jsbin.com/qejaf/2/edit。这是有效的,但我想知道是否有更简单的方法来做到这一点。例如,是否可以定义一个getter / setter(或只是getter)和通过publish
块公开它?
(旁白:在这个例子中有一点我希望能够引用一个命名的元素构造函数,但它似乎在ready
期间不可用。)
答案 0 :(得分:5)
几点:
截至目前,您无法发布吸气剂,因为Polymer没有 支持它的机器。我们可能会在将来改进这一点,但它是 不太重要,因为你可以用计算机做类似的工作 属性和观察者。肯定有计划进行 一个正式的计算属性语法,这应该使事情更清楚。
一般来说,你不应该试着观察一个吸气剂,因为(正如Jan
注意到)Object.observe
无法知道值是否已经改变
(令人困惑的是,它经常在observe.js
polyfill下工作,因为
脏检查;即便如此,脏检查吸气剂也是一个坏主意
因为吸气剂可能是任意昂贵的计算
[例如。可能会使用offsetWidth
并强制重新设置样式]。
不支持将可绑定属性设置为只读。 Polymer默认采用双向数据绑定方式采取了一种不寻常的方法。选择这种方法是为了减少开发人员的认知负荷(数据不会传播,所有绑定属性总是反映相同的值)。另一方面,观察副作用总是异步。在下面的jsbin中,我将count
设置为只读,但仅限于它与任何尝试设置它的异步快照回私有值。
答案 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>