Polymer Single模板实例未更新

时间:2015-02-05 15:43:56

标签: templates data-binding polymer

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

1 个答案:

答案 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

  • Object.observe() API是ES Harmony提案的一部分。因此,它依赖于浏览器。
  • 目前,支持它的唯一浏览器是Chrome。