Ember计算属性和Handlebars模板

时间:2015-11-09 11:41:04

标签: javascript ember.js handlebars.js

在我的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是如何在控制器/模板中工作的?我需要一种方法,以便我不必在我的模板中添加这个虚拟代码。

1 个答案:

答案 0 :(得分:0)

由于您正在观察数组,因此它应该是property('itemsWithData.[]')'[]'观察数组中其对象集的任何更改(即添加和删除对象),但如果这些对象上的属性发生更改,则不会触发。请参阅文档here

如果您想观察数组中每个元素的特定属性,它将是property('itemsWithData.@each.name'),它会观察itemsWithData中每个元素的名称集。如果添加或删除元素,它也会触发。请参阅文档here

属性是懒惰计算的(而观察者不是),因此向模板添加itemsWithData会强制计算itemsWithData。如果它在其他地方没有被调用,则不会被计算。

另请注意Ember overrides the native array。因此,如果您将Ember.EXTEND_PROTOTYPESEmber.EXTEND_PROTOTYPES.Array设置为false,则观察数组可能无效。

相关问题