保存时,ember.js手动设置hasDirtyAttributes未清除

时间:2017-06-15 16:38:08

标签: ember.js dirty-tracking

我的模板中有一个保存按钮,当模型具有脏属性

时会激活该按钮

当对相关模型的引用发生更改时,似乎未设置hasDirtyAttributes标志。

示例
我有一个下拉列表,允许选择一个名为 contact 的相关模型 如果我更改任何直接属性(例如名称),一切都按预期工作,并且保存按钮激活。
当我更改联系人时,它没有,我认为这是设计的,所以我在我的更改操作被触发时设置了标志。

我在路线行动中设置了这个:

actions:{ 

    updateProductionContact: function(contact){
         this.set('currentModel.customer.hasDirtyAttributes',true);             
         this.set('currentModel.customer.production_contact',contact);
    },
}

现在再次运作。当我更换联系人时,保存按钮会亮起 但是,当我现在单击“保存”时,hasDirtyAttributes标志保持为true(按钮保持活动状态),而之前它已被清除,直到进行了另一次更改。

我希望框架在成功保存后自动重新设置标志,就像之前一样。我当然可以在按钮的保存操作上重新设置标志。

感觉就像我在解决一个问题,并且可能不会手动设置脏的属性,或者我应该使用不同的肮脏指示。

我的问题:如何妥善处理?

2 个答案:

答案 0 :(得分:1)

hasDirtyAttributesDS.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}}

到目前为止,这似乎运作良好。我可以利用自动脏跟踪来获得正常属性。