似乎在通过至少2层getter使用single template时,当基础值发生变化时,绑定不再更新。矛盾的是,这似乎在使用iterative templates时起作用。
这有点难以解释,我不是100%肯定这就是绑定失败的原因所以这里是一个最小的(ish)例子来说明:
<polymer-element name="test-binding">
<template>
<template bind="{{ getterMap }}">
<span>{{ name }}</span>
</template>
</template>
<script>
(function(){
Polymer('test-binding', {
ready: function(){
var getterMap = {};
Object.defineProperty(this, 'getterMap', {
get: function(){ return getterMap; },
set: function(newValue){ getterMap = newValue; }
});
var name = 'foo';
Object.defineProperty(getterMap, 'name', {
get: function(){ return name; },
set: function(newValue){ name = newValue; }
});
setInterval(function(){
this.getterMap.name = 'foo '+Math.random();
}.bind(this), 2000);
}
});
})();
</script>
</polymer-element>
与之相伴的jsfiddle。
答案 0 :(得分:3)
经过一些调整后,事实证明,正常的模板绑定不能直接与Object.defineProperty
对象一起使用。您的列表模板有效,因为它将getterMap粘贴到未由Object.defineProperty
定义的属性上的数组中。将列表转换为Object.defineProperty后,它将停止工作。
<强>更新强>
经过进一步测试后,它仅适用于get()
和set()
s。如果使用writable
value
描述符描述了defineProperty,它的工作正常。
经过一些搜索后,Google网上论坛上的这篇文章显示,如果您想利用数据绑定,可能无法使用getter / setter。
Attributes and Observers vs Getters/Setters
更新2:
根据this issue discussion,您可以通过Object.observe()向对象访问器添加数据绑定。它需要使用Object.getNotifier()和Notifier.notify()。但是,使用此API会带来一些顾虑。要查看正在使用的内容,请查看this fiddle。