如何观察Ember.Array中的嵌套属性
问题描述:
假设我有一个模型Stock
,它有几个StockPartition
(它的属性名为partitions
,它的一个数组)。如何观察Ember.Array中的嵌套属性
的Stock
模型有一个属性usedAmount
应该改变,当任何的所有partition.amount
变化,以及,当然,当加入一个分区/移除被更新。
例子:
stock.get('usedAmount') -> 0
stock.get('partitions') -> [Class, Class, Class]
stock.get('partitions')[0].set('amount', 12)
stock.get('usedAmount') -> I want here to return 12
stock.get('partitions')[1].set('amount', 12)
stock.get('usedAmount') -> I want here 24
怎么可能Stock
观察每个partitions.amount
? 我可以编写一个函数addPartition
,看起来像这样:
addPartition: function(partition) {
partition.addObserver('amount', function() {
this.get('owner').notifyPropertyChange('usedAmount');
});
}
但我希望有一个更好的解决方案。
答
我会使用强大的计算属性。您也可以对Ember.Enumerable
的可用的有用的方法使用,请参阅http://jsfiddle.net/pangratz666/BxyY4/:
App.partitionsController = Ember.ArrayProxy.create({
content: [],
addPartition: function(amount) {
this.pushObject(Ember.Object.create({
amount: amount
}));
},
usedAmount: function() {
// reduce by adding all 'amount' values, start with initial value 0
return this.reduce(function(previousValue, item) {
return previousValue + item.get('amount');
}, 0);
}.property('@each.amount')
});
的reduce
在docs被记录在案。
它的功能就像一个魅力,它的确做得更好! – louiscoquio 2012-04-23 19:11:18
是的,'Ember.Enumerable'为这些常见任务提供了一些非常好的方法。 – pangratz 2012-04-23 19:31:55