【问题标题】:Computed property isn't recomputed when array dependency is mutated当数组依赖发生突变时,不会重新计算计算属性
【发布时间】:2015-06-04 17:52:02
【问题描述】:

我将计算属性用作itemsdom-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,而是将它设置为一个新数组,它确实有效:

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

这是错误还是预期行为?

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

【问题讨论】:

    标签: polymer polymer-1.0


    【解决方案1】:

    我与 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 知道它应该在数组的内容发生变化时更新计算的属性绑定。


    如果不是因为,我不会在这里代替 Scott 发布这个

    sjmiles: @vartan: otoh,如果你能把你学到的东西抄录下来,那会对我有帮助,时间是我最没有弹性的资源

    【讨论】:

    • 还要注意计算属性的函数不再直接传递给数组,而是作为一个名为base的属性。所以function(values) {...}变成function(info) {var values = info.base; ...}
    • @TrevorDixon 天哪,我忽略了!大吼声。我在 :) 中添加了所有额外的细节,感谢您的关注!