在我的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_PROTOTYPESEmber.EXTEND_PROTOTYPES.Array设置为false,则观察数组可能不起作用。

10-07 22:02