2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)
1. 通常,你可能有一个计算的属性依赖于数组中的所有元素来确定它的值。例如,你可能想要计算controller中所有todo items的数量,以此来确定完成了多少任务。
export default Ember.Controller.extend({ todos: [ Ember.Object.create({ isDone: true }), Ember.Object.create({ idDone: false }), Ember.Object.create({ isDone: true }) ], remaining: Ember.computed('todos.@each.isDone', function () { var todos = this.get('todos'); return todos.filterBy('isDone', false).get('length');//1 }); });
- 注意这里依赖的key(todos.@each.isDone)包含特殊的key @each。
- 当以下四个事件发生时,这指示ember.js更新此计算属性的绑定和触发观察者:
- todos数组中的任何对象的isDone属性发生改变。
- todos数组中添加一项。
- 从todos中删除一项。
- controller的todos属性被改变为另外一个数组。
- 在上面的例子中,reamaining的count值是1:
import TodosController from 'app/controllers/todos'; todosController = TodosController.create(); todosController.get('remainging');
2. 如果我改变todo's isDone属性, remaining属性将会被自动更新:
var todos = todosController.get('todos'); var todo = todos.objectAt(1); todo.set('isDone', true); todosController.get('remaining'); //0 todo = Ember.Object.Create({ isDone: false }); todos.pushObject(todo); todosController.get('remaining');//1
3. 请注意@each不能嵌套。
正确:todos@each.owner.name
错误:todos@each.owner.@each.name