我正在开发一个简单的预算应用程序,有2个模型:类别和条目。类别有很多条目。
Ember 2.2
问题:类别已计算出监视相关条目的属性total
和difference
。添加和删除条目时会更新这些计算属性,但在条目属性更改时不会更新。
以下是类别模型:
# app/models/category.js
export default DS.Model.extend({
name: DS.attr('string'),
budgetAmount: DS.attr('number'),
budgetSheet: DS.belongsTo('budget-sheet'),
entries: DS.hasMany('entry'),
total: Ember.computed('entries.@each.amount', {
get() {
let entries = this.get('entries');
return entries.reduce(function(previousValue, entry){
return previousValue + entry.get('amount');
}, 0);
}
}),
difference: Ember.computed('budgetAmount', 'total', {
get() {
return this.get('budgetAmount') - this.get('total');
}
})
});
这是路线:
# app/routes/budget-sheet.js
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model(params) {
return this.store.find('budget-sheet', params.budgetSheetId);
},
setupController(controller, model) {
controller.set('budgetSheet', model);
controller.set('categories', model.get('categories'));
}
});
这是控制器,其中包含添加/删除/更新条目的操作:
# app/controllers/budget-sheet.js
export default Ember.Controller.extend({
entries: Ember.computed('categories.@each.entries', {
get() {
let result = [];
this.get('categories').map(function(category) {
category.get('entries').forEach(function(entry) {
return result.push(entry);
});
});
return result;
}
}),
actions: {
...
updateEntry(id, attribute, value) {
let entry = this.store.peekRecord('entry', id);
entry.set(attribute, value);
entry.save();
},
deleteEntry(id) {
let entry = this.store.peekRecord('entry', id);
entry.destroyRecord();
}
}
});
模板遍历categories
并显示计算出的属性。该模板还有一个entry-form
组件,负责将数据发送到控制器中的函数(addEntry
,updateEntry
)。
添加或删除条目时,模板会更新。更改条目的类别时,将更新模板。更新条目的金额时,模板不会更新。
答案 0 :(得分:0)
事实证明,如本期所述,Ember 2.1.1和2.2.0中的计算属性存在错误:https://github.com/emberjs/ember.js/issues/12475
Github问题中的评论建议在hasMany关系上手动设置{async: false}
,这对我的问题有效。此更改已更正我在计算属性未更新时遇到的所有问题:
# app/models/category.js
- entries: DS.hasMany('entry'),
+ entries: DS.hasMany('entry', {async: false}),
答案 1 :(得分:0)
你确实遇到了this open Bug that @jeffreyj linked.
但你可以通过替换
来解决这个问题%P
与
total: Ember.computed('entries.@each.amount', {
这是因为total: Ember.computed('entries.content.@each.amount', {
将返回entries
并且PromiseArray
目前已损坏。但是@each
你有实际值,所以这将有效。
答案 2 :(得分:-1)
在Ember 2.2中@each不再存在,虽然你没有得到任何使用它的错误对象的结果。@ each总是一个空数组
如果您只想获得我会亲自使用属性函数
对于属性模型,编辑:这是错误的。@ each.property仍然是答案中弃用指南的正确链接