我环顾四周,但我找不到任何关于以下内容之间实际差异的文件:
Ember.Object.extend({
// ...
myProperty1: function() { /* ... */ }.property('myArray'),
myProperty2: function() { /* ... */ }.property('myArray.content'),
myProperty3: function() { /* ... */ }.property('myArray.[]'),
myProperty4: function() { /* ... */ }.property('myArray.@each')
});
我确实理解.content
似乎是属性的数组的内部存储,如果这恰好是PromiseArray
,则可能无法使用。我也理解@each
不会以这种方式使用,但主要是访问ProxyArray
,因为映射了此数组中每个元素的内部属性而生成结果。
除了那些微妙的差异外,它们看起来几乎一样。但是myArray
和myArray.[]
呢?那么他们与其他人的情况有什么关系呢?
答案 0 :(得分:3)
Ember.Object.extend({
// ...
// Updates if myArray is set to a new value using .set
myProperty1: function() { /* ... */ }.property('myArray'),
// Updates if myArray is an Ember Object (like an ArrayController)
// and its 'content' property is set to a new value using
// .set('content', newArray) or .replaceContent(...)
// which can also happen implicitly
// Also note that for an ArrayController 'content' is an alias of 'model'
myProperty2: function() { /* ... */ }.property('myArray.content'),
// Updates if myArray is an Ember Array or ArrayProxy or MutableEnumerable
// and it is 'mutated' using myArray.addObject(s), myArray.removeObject,
// myArray.popObject, myArray.shiftObject, myArray.pushObject(s), etc.
myProperty3: function() { /* ... */ }.property('myArray.[]'),
// Updates if myArray is an Ember Array or ArrayProxy and one of it's
// elements is set to a new value using .set or .replace
// such as this.set('myArray.firstObject', 10) or
// this.get('myArray').replace(2, 1, [10]);
myProperty4: function() { /* ... */ }.property('myArray.@each')
});
我还要注意,如果您忘记使用Ember的方法之一,只需使用简单的JavaScript更新数组:
this.myArray = [];
这些计算属性都不会更新。