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

Posted

技术标签:

【中文标题】如何在 Ember.js 中创建计算属性以查看单个 Ember Data 属性是不是脏?【英文标题】:How do you create a computed property in Ember.js to see if a single Ember Data attribute is dirty?如何在 Ember.js 中创建计算属性以查看单个 Ember Data 属性是否脏? 【发布时间】:2016-07-11 05:02:35 【问题描述】:

我尝试在 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

【问题讨论】:

【参考方案1】:

我相信这是因为 hasDirtyAttributes 没有在任何地方被使用,这意味着更改观察者不会正确设置。

一个简单的解决方法是:

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

这可确保 hasDirtyAttributes 属性被使用,并且该属性将在其他属性更改时更新。一般来说,如果你有一个属性作为依赖键,你肯定应该在计算函数体中getting它,如果你在函数体中getting一个属性,它应该总是被列为依赖键。我相信它以这种方式工作的原因是性能优化。

【讨论】:

以上是关于如何在 Ember.js 中创建计算属性以查看单个 Ember Data 属性是不是脏?的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js 在回调中返回计算属性

Ember.js:在服务的把手中使用计算属性

如何查看从电子商务中创建单个产品详细信息的页面

Ember.js、set() 和计算属性

Ember js构建会引发空合并错误

Ember.JS - 无法根据计算属性进行过滤或过滤