2015-02-05 71 views
2

似乎在通过至少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用它。

回答

3

稍加调整后,事实证明,正常的模板结合不直接在目标物体与Object.defineProperty工作。您的列表模板工程,因为它粘在getterMap通过Object.defineProperty没有定义属性的数组。将列表转换为Object.defineProperty后,它停止工作。

更新:

进一步测试后,它仅适用于get() S和set()秒。如果defineProperty与writablevalue描述符描述,它工作得很好。

经过一番搜索之后,Google Groups上的这篇文章揭示了如果要利用数据绑定,getters/setters可能不会被使用。

Attributes and Observers vs Getters/Setters

更新2:

根据this issue discussion,可以添加数据绑定到对象的存取,通过Object.observe()。它需要使用Object.getNotifier()和Notifier.notify()的。但是,使用此API带来一些问题。要看到它在使用中,检查出this fiddle

  • Object.observe() API是ES Harmony提案的一部分。所以,它非常依赖于浏览器。
  • 目前,唯一支持它的浏览器是Chrome。
+0

有一种方法可以通过访问器强制绑定更新,请参阅我在此聚合物[issue](https://github.com/Polymer/polymer/issues/277)中的评论。你介意相应地更新你的答案吗? – Renaud 2015-02-12 12:11:16

+0

谢谢你! – 2015-02-16 19:16:53