我的模板中有一个保存按钮,当模型具有脏属性
时会激活该按钮当对相关模型的引用发生更改时,似乎未设置hasDirtyAttributes标志。
示例
我有一个下拉列表,允许选择一个名为 contact 的相关模型
如果我更改任何直接属性(例如名称),一切都按预期工作,并且保存按钮激活。
当我更改联系人时,它没有,我认为这是设计的,所以我在我的更改操作被触发时设置了标志。
我在路线行动中设置了这个:
actions:{
updateProductionContact: function(contact){
this.set('currentModel.customer.hasDirtyAttributes',true);
this.set('currentModel.customer.production_contact',contact);
},
}
现在再次运作。当我更换联系人时,保存按钮会亮起 但是,当我现在单击“保存”时,hasDirtyAttributes标志保持为true(按钮保持活动状态),而之前它已被清除,直到进行了另一次更改。
我希望框架在成功保存后自动重新设置标志,就像之前一样。我当然可以在按钮的保存操作上重新设置标志。
感觉就像我在解决一个问题,并且可能不会手动设置脏的属性,或者我应该使用不同的肮脏指示。
我的问题:如何妥善处理?
答案 0 :(得分:1)
hasDirtyAttributes
是DS.Model
的计算属性,因此如果设置它,则不应手动设置,然后下次不再重新计算。如果属性发生任何变化,它将被更新。
就像Alexma在评论中建议的那样,您可以使用dirtyAttributes
。参考https://guides.emberjs.com/v2.13.0/models/creating-updating-and-deleting-records/#toc_persisting-records
但不要自己设定。
参见: https://github.com/emberjs/data/blob/v2.13.0/addon/-private/system/model/model.js#L162
答案 1 :(得分:0)
事实证明,hasDirtyAttributes是一个函数/计算属性。所以使用set(...,true)会用布尔值覆盖函数,这不是我们想要的。
有一种方法可以让ember中的计算属性具有setter和getter,但这似乎没有在这里实现。
我提出了以下解决方案。
基本上,它为相关模型实现了一个单独的自定义标志。
在路线的模型属性中,我定义了一个额外的属性:
model: function(params) {
return Ember.RSVP.hash({
customer: this.store.findRecord('customer',params.id),
....
dirtyRelations: false
});
}, ...
然后我在更改相关模型时手动设置
updateProductionContact: function(contact){
this.set('currentModel.dirtyRelations',true);
...
}, ...
我的保存功能将其设置为假。
updateCustomer: function(){
this.get('currentModel.customer').save();
this.set('currentModel.dirtyRelations',false);
}
我的template.hbs检查hasDirtyAttributes或dirtyRelations
{{#if (or model.customer.hasDirtyAttributes model.dirtyRelations)}}
highlighted save
{{else}}
plain save
{{/if}}
到目前为止,这似乎运作良好。我可以利用自动脏跟踪来获得正常属性。