在我的Ember控制器中,我有2个计算属性(CP),如下所示;
itemsWithData: function() {
var dataItems = [];
return dataItems;
}.property('containsFailure'),
someArray: function() {
var items = this.get('itemsWithData');
var someArray = [];
return someArray;
}.property('itemsWithData')
现在在我的Ember Handlerbars模板中,虽然我只使用someArray CP来迭代并显示值,但我没有使用其他CP(即itemsWithData)
但是如果我在模板中没有引用itemsWithData,那么我的控制器中也没有执行相同的操作(因此即使someArray也不执行,因为它依赖于itemsWithData)
只有在我明确地添加虚拟引用时才会执行;
{{#each itemsWithData as |data|}}
{{/each}}
CP是如何在控制器/模板中工作的?我需要一种方法,以便我不必在我的模板中添加这个虚拟代码。
答案 0 :(得分:0)
由于您正在观察数组,因此它应该是property('itemsWithData.[]')
。 '[]'
观察数组中其对象集的任何更改(即添加和删除对象),但如果这些对象上的属性发生更改,则不会触发。请参阅文档here。
如果您想观察数组中每个元素的特定属性,它将是property('itemsWithData.@each.name')
,它会观察itemsWithData
中每个元素的名称集。如果添加或删除元素,它也会触发。请参阅文档here。
属性是懒惰计算的(而观察者不是),因此向模板添加itemsWithData
会强制计算itemsWithData
。如果它在其他地方没有被调用,则不会被计算。
另请注意Ember overrides the native array。因此,如果您将Ember.EXTEND_PROTOTYPES
或Ember.EXTEND_PROTOTYPES.Array
设置为false
,则观察数组可能无效。