当数组依赖项发生变异时,不会重新计算计算属性

时间:2015-06-04 17:52:03

标签: polymer polymer-1.0

我使用计算属性作为items的{​​{1}}。

dom-repeat

当其依赖项<template is="dom-repeat" items="{{double(values)}}"> <span>{{item}}</span> </template> 发生更改时,不会重新计算该属性。

values

如果我将其设置为新数组,而不是改变addValue: function() { this.push('values', this.values.length+1); this.async(this.addValue, 1000); }, ,它确实有效:

values

这是错误还是预期的行为?

演示:http://plnkr.co/edit/SmAHKMHhSPWgmBhBBzAv?p=preview

1 个答案:

答案 0 :(得分:10)

我与聚合物背后的团队成员斯科特迈尔斯谈过,我得到了回复:

为了使计算属性正确绑定,您必须使用[[double(values.*)]]

传递给double函数的参数将是一个包含属性pathvaluebase的对象,就像路径观察一样。

  • path将引用一个路径字符串,用于指定数组中是否更新了lengthsplices
  • value将是lengthsplices的值,
  • base将引用您的数组。

示例:

<template is="dom-repeat" items="[[double(values.*)]]">
  <span>[[item]]</span>
</template>

<script>
  ...
  double: function(e) {
    return e.base.map(function(n) { return n*2; });
  }

文档:https://www.polymer-project.org/1.0/docs/devguide/properties.html#array-observation

演示:http://plnkr.co/edit/Idrz5XvLn9SZ35iR8pGT?p=preview

dom-repeat模板希望使用集合,因此当您直接将其绑定到values时,它就会知道values中的项目。

计算属性没有任何此类期望,因此[[double(values)]]在这种情况下不起作用,因为它只会在values引用本身更改时更新,当数组中的项目发生更改时。使用values.*让Polymer知道它应该在数组的内容发生变异时更新计算属性绑定。

如果不是为了

,我不会在斯科特这里发布这个
  sjmiles:@vartan:otoh,如果你可以转录你学到的东西,它会对我有所帮助,时间是我最不具弹性的资源