使用聚合物元素的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
.)
几点:
截至目前,您无法发布getter,因为Polymer没有机器来支持它.我们将来可能会对此进行改进,但它并不重要,因为您可以使用计算属性和观察者进行类似的工作.肯定有计划使用正式的计算属性语法,这应该会使事情更清楚一些.
一般来说,你不应该试着观察一个吸气剂,因为(正如Jan所说)Object.observe
无法知道这个值是否已经改变(令人困惑的是,observe.js
由于脏检查,它通常在polyfill 下工作;即便如此,脏检查吸气剂这是一个坏主意,因为getter可能是一个任意昂贵的计算[例如可能会使用offsetWidth
并强制重新设置样式]).
将可绑定属性设置为只读不受支持.Polymer默认采用双向数据绑定方式采取了一种不寻常的方法.选择这种方法是为了减少开发人员的认知负荷(数据不会传播,所有绑定属性总是反映相同的值).另一方面,观察副作用始终是异步的.在下面的jsbin中,我做了count
只读,但只是在某种意义上它会异步地回到私有值来设置它的任何尝试.