如何在 Ember.js 中创建计算 属性 以查看单个 Ember 数据属性是否脏?

How do you create a computed property in Ember.js to see if a single Ember Data attribute is dirty?

我试过在 Ember Data 1.13.16 模型上创建计算 属性,如下所示:

export default DS.Model.extend({
  name: DS.attr('string'),
  isNameDirty: Ember.computed('name', 'hasDirtyAttributes', function() {
    return !!this.changedAttributes()['name'];
  })
});

但出于某种原因,在调用 model.save() 之后,属性 永远不会重新计算为 false,即使 name 不再出现在 changedAttributes() 中。我怎样才能使这个计算 属性 工作?

这是一个简化的测试用例:https://ember-twiddle.com/87b1af7abfb103554cb2?openFiles=models.author.js%2C

我认为这是由于 hasDirtyAttributes 未在任何地方使用,这意味着更改观察器将无法正确设置。

一个简单的修复方法是:

isNameDirty: Ember.computed('name', 'hasDirtyAttributes', function() {
  if (!this.get('hasDirtyAttributes')) { return false; }
  return !!this.changedAttributes()['name'];
})

这确保 hasDirtyAttributes 属性 被消耗并且当其他 属性 改变时这个 属性 将被更新。一般来说,如果你有一个 属性 作为依赖键,你绝对应该 get 在计算函数体中使用它,如果你 get 使用 属性在函数体中,它应该始终作为依赖键列出。我相信它以这种方式工作的原因是由于性能优化。