如何在Ember.js中创建一个计算属性来查看单个EmberData属性是否脏

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

本文关键字:属性 计算 单个 是否 EmberData 一个 js Ember 创建      更新时间:2023-09-26

我尝试在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()之后,即使name不再存在于changedAttributes()中,该属性也不会重新计算为false。如何使此计算属性工作?

以下是一个简化的测试用例: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,那么它应该始终列为依赖键。我相信它以这种方式工作的原因是由于性能优化。