Computed 属性 不会在数组依赖性发生变化时重新计算
Computed property isn't recomputed when array dependency is mutated
我正在使用计算的 属性 作为 dom-repeat
的 items
。
<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))
这是错误还是预期行为?
我与 Polymer 背后的团队成员 Scott Miles 进行了交谈,我得到了回复:
为了使计算的 属性 正确绑定,您必须使用 [[double(values.*)]]
.
传递给您的 double
函数的参数将是一个具有属性 path
、value
和 base
的对象,就像在路径观察中一样。
path
将引用指定 length
或 splices
是否在数组中更新的路径字符串,
value
将是 length
或 splices
的值,而
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
我正在使用计算的 属性 作为 dom-repeat
的 items
。
<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))
这是错误还是预期行为?
我与 Polymer 背后的团队成员 Scott Miles 进行了交谈,我得到了回复:
为了使计算的 属性 正确绑定,您必须使用 [[double(values.*)]]
.
传递给您的 double
函数的参数将是一个具有属性 path
、value
和 base
的对象,就像在路径观察中一样。
path
将引用指定length
或splices
是否在数组中更新的路径字符串,value
将是length
或splices
的值,而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