Ember Computed属性和Handlebars模板

Ember Computed properties and Handlebars templates

本文关键字:Handlebars 模板 属性 Computed Ember      更新时间:2023-09-26

在我的Ember控制器中,我有两个计算属性(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.[]')'[]'观察数组中对象集的任何变化(即添加和删除对象),但如果这些对象上的属性发生变化,则不会触发。请参阅此处的文档。

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

属性是延迟计算的(而观察者不是),因此将itemsWithData添加到模板中会强制计算itemsWithData。如果没有在其他地方调用它,则不会对其进行计算。

还要注意,Ember会覆盖本机数组。因此,如果将Ember.EXTEND_PROTOTYPESEmber.EXTEND_PROTOTYPES.Array设置为false,则观察阵列可能不起作用。