'[]'属性和ember.js中的'@each'属性有什么区别?

时间:2013-05-01 16:09:38

标签: ember.js

我注意到可枚举的mixin具有依赖于'[]'属性的计算属性,而ember数组也具有'@each'属性。

依赖'[]''@each'有什么区别?

我模糊的理解(如果我错了,请纠正我)是在替换数组内容时触发'[]'。但这取决于房产本身有何不同?

考虑以下课程:

C = Ember.Object.extend({
  things: null,
  watcher1: (function() {
    console.log('watcher1')
  }).observes('things.[]'),
  watcher2: (function() {
    console.log('watcher2')
  }).observes('things.@each')
});

我按如下方式创建一个实例:

c = C.create({things: Ember.A(['a', 'b'])});

以下内容:

c.get('things').replace(0, 1, ['z'])

触发watcher1watcher2

以下内容:

c.get('things').setObjects(['1', '2'])

还会触发watcher1watcher2

同样如此:

c.get('things').addObject('v')

那有什么不同吗?我们何时应该使用一个与另一个?

谢谢! 凯文

1 个答案:

答案 0 :(得分:25)

如果需要观察数组元素的属性,请使用@each

@each支持观察数组内元素的属性。例如,people.@each.name。括号表示法不支持此功能。这是jsbin demo

@each是一个property of Array instances,它返回一个处理委派的EachProxy instance。另一方面,[]只是returns this

如果您需要使用[]处理非数组枚举,请使用

根据余烬更改日志,括号中的括号0.9.4已取消括号中的@each,但随后在0.9.8中重新启用。 The commit that re-enables it表示[]可用于非数组枚举,例如Ember.Set个实例。 jsbin demo