【问题标题】:Ember Set/Save Doesn't Update Computed PropertiesEmber 设置/保存不更新计算属性
【发布时间】:2016-04-22 08:45:48
【问题描述】:

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

灰烬 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)。

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

【问题讨论】:

  • 我不知道,您使用的是哪个 ember 版本,但您尝试过:total: Ember.computed('entries.[].amount', 吗?
  • 感谢您的推荐。我在 Ember 2.2 上。我确实尝试将计算属性更新为entries.[].amount,但这并没有解决属性不更新的问题。

标签: ember.js ember-data


【解决方案1】:

你确实遇到了this open Bug that @jeffreyj linked.

但是你可以通过替换来解决这个问题

total: Ember.computed('entries.@each.amount', {

total: Ember.computed('entries.content.@each.amount', {

这是因为entries 将返回一个PromiseArray,而@each 当前已损坏。但是在content 下,你有实际的价值,所以这会起作用。

【讨论】:

  • 感谢您对我发现的内容进行验证,并提供了一个更好的解决方法,它不会与async: false 建立关系。 +1
【解决方案2】:

事实证明,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}),

【讨论】:

  • 可能适用于您的情况,但使用content 解决方法绝对是更好的解决方案,因为您的关系通常需要异步。
【解决方案3】:

在 Ember 2.2 中,@each 不再存在,尽管使用它时对象的结果不会出现任何错误。@each 始终是一个空数组

如果你只想得到我会亲自使用属性函数

编辑:这是错误的属性模型。@each.property 仍然是答案中的弃用指南的正确链接

【讨论】:

  • 我相信 @each 作为叶子已被弃用,但不是 @each.prop。您能否为您的“不再存在”断言提供参考?
  • @torazaburo @christian-stengel 从我在发行说明中可以看到,.@each 作为叶子已被.[] 弃用,但@each.prop 没有。跨度>
  • @torazaburo 你是对的,我不知道link
猜你喜欢
  • 2012-08-04
  • 2014-03-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2017-04-10
  • 2014-08-19
相关资源
最近更新 更多