聚合物中的静态属性

时间:2015-07-22 19:25:16

标签: polymer polymer-1.0

我正在尝试在Polymer中创建服务,但我不明白我应该如何创建静态属性。

我需要它们为所有实例共享相同的值(“静态”)但是我还需要在更新时在每个实例上触发观察者。

我知道我可以在Polymer()调用的范围内创建一个变量,如下所示:

var users = [];
Polymer({
  is: 'my-service',
  properties: {
    users: {
      type: Array,
      value: users,
      notify: true,
    }
  },
  // ...
});

但它不符合第二个标准。如果我从一个实例更新它,它不会触发其他实例的观察者。

您是否知道如何在不手动触发每个实例的观察者的情况下执行此操作? (我可以这样做,但在这种情况下会破坏使用框架的想法。)

编辑:另一种方法是创建一个单身人士,但我认为这不可能。

2 个答案:

答案 0 :(得分:2)

使用观察者创建静态属性实际上非常简单。您遇到的问题是Polymer的设计和Array.prototype方法的本机实现的组合。

数组和对象观察者(深度/路径观察者)与其他属性观察者的工作方式略有不同。通常,通知仅在实例更改时才有效。此外,大多数Array.prototype.functions返回已修改数组的新实例...因此,当您拼接数组时,将另一个实例设置到对象的属性值(而不是静态属性&#) 39; s value)并且现在不再等于您设置的原始静态数组。这就是为什么只通知修改实例的原因。

我唯一要求克服此问题的建议是:不要使用Array.prototype.splice()this.splice()。即使你在静态属性上执行此操作,结果也将始终是一个新的数组,导致不协调的数据。在这里,您有两种选择:使用Polymer set API或删除索引并手动notifyPath()

以下是讨论两者的链接:

Data binding - Path change notification

答案 1 :(得分:1)

<dom-module id="my-service">
  <template>
    <iron-meta id="my-service-users" value="{{users}}"></iron-meta>
  </template>
  <script>
    Polymer({
      is: 'my-service',
      properties: {
        users: {
          type: Array,
          value: function(){return [];},
          notify: true
        }
      }
    });
  </script>
</dom-module>

iron-meta创建一个单例值,自动更新所有实例中的users值,这也应该触发任何相关的观察者。