在我的Ember Controller中,我有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在控制器/模板中是这样工作的吗?我需要一种不必在模板中添加此伪代码的方法。
最佳答案
由于您正在观察数组,因此它应该为property('itemsWithData.[]')
。 '[]'
观察数组中对象集是否有任何更改(即添加和删除对象),但是如果这些对象上的属性发生更改,则不会触发。参见文档here。
如果要观察数组中每个元素的特定属性,则为property('[email protected]')
,它观察itemsWithData
中每个元素的名称集。如果添加或删除元素,它也会触发。参见文档here。
属性是惰性计算的(而观察者则不是),因此将itemsWithData
添加到模板中将强制计算itemsWithData
。如果未在其他任何地方调用它,则将不会计算它。
另请注意,灰烬overrides the native array。因此,如果将Ember.EXTEND_PROTOTYPES
或Ember.EXTEND_PROTOTYPES.Array
设置为false
,则观察数组可能不起作用。