2015-10-20 2 views
0

У меня есть модель с имущественными «таксы»Ember вычислен свойство из модельного массива

fees: DS.hasMany('fee') 

и модель платы со свойством «количество»

amount: DS.attr('string') 

в мой контроллер я хочу вычисляемый свойство, которое складывает все суммы гонораров, так что я это

feeTotal: Ember.computed('[email protected]', function() { 
    var total = 0; 
    this.get('model').get('fees').forEach(function(fee) { 
    total += Number(fee.get('amount')); 
    }); 
    return total; 
}) 

Это вычислить плату на начальном этапе, и recompu когда добавляется новый сбор, но он не пересчитывает, когда изменяется сумма комиссии. Например, при изменении следующего поля ввода будет обновлена ​​сумма, но не вычисленная сумма.

{{#each model.fees as |fee|}} 
    {{input value=fee.amount type="number" placeholder="Fee Amount"}} 
{{/each}} 

Я пропустил что-то в том, как написано рассчитанное свойство?

+0

работает, если вы измените DS.attr ('string') на DS.attr ('number')? –

+0

нет, это не меняет результат. Проблема в том, что он не распознает изменения в свойстве, независимо от того, что это строка или число. – cswright

+1

Код выглядит хорошо для меня, хотя я заметил, что здесь упоминается подобная проблема после обновления ember. Если вы действительно отчаялись, вы можете попробовать '' 'Ember 2.0'''. Только совет, который я могу предоставить, состоит в том, что вы можете вычислять суммы и подобные вещи с помощью [reduce] (http://emberjs.com/api/classes/Ember.Enumerable.html#method_reduce) и в основном делать вычисляемые функции с одним слоем. – Keo

ответ

0

Вы должны добавить свойство model.fees.length для обновления totalAmount после добавления новых сборов.

Ember.computed('model.fees.length', '[email protected]', function() {...}); 

У меня есть некоторые идеи, которые вы можете попробовать:

-bind плат модель для базовой модели с DS.belongsTo()

-сохраняйте плату после изменения его значения

//template: 
<ul> 
    {{#each fees as |fee|}} 
    <li> 
     {{fee.amount}} - {{input type="number" value=fee.amount}} <button {{action 'save' fee}}>Save</button></li> 
    {{/each}} 
</ul> 

//controller 
actions: { 
    save(fee) { 
    fee.save(); 
    } 
} 

-watch для «грязных» значений

Ember.computed('model.fees.length', '[email protected]', '[email protected]', function() {...}); 
+0

, это ничего не меняет, но если это лучший способ его написать, я ценю его. – cswright

+0

i обновил свой ответ – dex07

+0

Почему все это имеет значение? –

Смежные вопросы