2015-02-05 63 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