Ember设置/保存不会更新计算属性

时间:2016-01-16 23:39:31

标签: ember.js ember-data

我正在开发一个简单的预算应用程序,有2个模型:类别和条目。类别有很多条目。

Ember 2.2

问题:类别已计算出监视相关条目的属性totaldifference。添加和删​​除条目时会更新这些计算属性,但在条目属性更改时不会更新。

以下是类别模型:

# 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组件,负责将数据发送到控制器中的函数(addEntryupdateEntry)。

添加或删除条目时,模板会更新。更改条目的类别时,将更新模板。更新条目的金额时,模板不会更新。

3 个答案:

答案 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仍然是答案中弃用指南的正确链接