控制器上的动态循环 属性

dynamic looping on a controller property

我正在使用 ember 2.17.

我将此 属性 添加到 controller:

export default Controller.extend({
  newAttachments: new Array()
  ...
})

我通过这个控制器在里面添加元素action

setAttachment(file) {
  console.log('trying');
  this.get('newAttachments').push(file);
}

当我使用该操作时,消息显示在控制台中,在 Ember 检查器中我可以看到数组不再为空:

但是,视图中的以下代码没有输出:

{{#each newAttachments as |file|}}
  <p>in loop</p>
{{/each}}

为什么不显示任何内容?在一个组件中它可以工作,为什么不在这里?

Ember 无法观察原生数组。因此框架不知道一个值被推入数组。您应该改用 ember 自己的 Ember.NativeArray and it's pushObject method。如果一个条目被添加到数组或从数组中删除,它确保框架得到通知。更改后的代码如下所示:

import { A } from '@ember/array';

export default Controller.extend({
  newAttachments: A(),

  setAttachment(file){
    this.get('newAttachments').pushObject(file)
  }
})

您不应将数组添加为 EmberObject 的 属性,因为这可能会在实例之间引入泄漏。在那种情况下,这不是生产问题,因为控制器在 ember.js 中是单例。但是您可能会在测试中看到奇怪的行为。 native classes 的重构将解决该问题,因为 class 字段不会在实例之间泄漏。对于旧的 Ember 基于对象的 classes,初始化 init 挂钩中的值或使用计算 属性 是处理该问题的常用方法:

// computed property
import { computed } from '@ember/object';
import { A } from '@ember/array';

export default Controller.extend({
  newAttachments: computed(() => A()),
});
// init hook
import { A } from '@ember/array';

export default Controller.extend({
  init() {
    this._super(...arguments);

    this.set('newAttachments', A());
  }
});

请注意,如果 运行 Ember >= 3.1.

,则无需使用 get()