Computed 属性 不会在数组依赖性发生变化时重新计算

Computed property isn't recomputed when array dependency is mutated

我正在使用计算的 属性 作为 dom-repeatitems

<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,而是将其设置为一个新数组,它确实有效:

this.set('values', this.values.concat(this.values.length+1))

这是错误还是预期行为?

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

我与 Polymer 背后的团队成员 Scott Miles 进行了交谈,我得到了回复:

为了使计算的 属性 正确绑定,您必须使用 [[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 知道它应该在数组的内容发生变化时更新计算的 属性 绑定。


如果不是

,我不会post代替斯科特来这里

sjmiles: @vartan: otoh, if you could transcribe what you learned, it would help me, time is my least elastic resource