如何观察Ember.Array中的嵌套属性

如何观察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') 
}); 

reducedocs被记录在案。

+0

它的功能就像一个魅力,它的确做得更好! – louiscoquio 2012-04-23 19:11:18

+0

是的,'Ember.Enumerable'为这些常见任务提供了一些非常好的方法。 – pangratz 2012-04-23 19:31:55