Как наблюдает за вложенными свойствами в Ember.Array

Предположим, у меня есть модель Stock, в которой есть несколько StockPartition (это свойство называется partitions, это массив).

Модель 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');
  });
}

Но я надеюсь, что есть лучшее решение.


person louiscoquio    schedule 23.04.2012    source источник


Ответы (1)


Я бы использовал мощные вычисляемые свойства. Также вы можете использовать полезные методы, доступные на 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 описан в документах.

person pangratz    schedule 23.04.2012
comment
Да, Ember.Enumerable предлагает несколько очень хороших методов для таких общих задач. - person pangratz; 23.04.2012