给定两个模型,我如何确保对“子”对象的更新将“父”对象标记为“脏”,以便save
对父对象的调用不会跳过?
细节
使用 ember-model,我定义 Person
了 Address
如下模型:
App.Person = Ember.Model.extend({
id: Ember.attr(),
name: Ember.attr('string'),
address: Ember.belongsTo('App.Address', { key: 'address', embedded: true }),
});
App.Address = Ember.Model.extend({
id: Ember.attr(),
line1: Ember.attr('string'),
line2: Ember.attr('string')
});
现在我已经将它呈现在一个表单中,并使这些属性可编辑:
{{input value=model.name classNames="name"}}
{{input value=model.address.line1 classNames="address-line1"}}
{{input value=model.address.line2 classNames="address-line2"}}
<button type='button' {{action 'save'}}>Save</button>
<button type='button' {{action 'cancel'}}>Cancel</button>
到目前为止,一切都很好。最后一个难题是将模型持久化到服务器
actions: {
save: function() {
var model = this.get('model');
var address = model.get('address');
console.log(
"model.get('isDirty')=", model.get('isDirty'), //false
"address.get('isDirty')=", address.get('isDirty') //true
);
model.save();
model.get('address').save();
},
cancel: function() {
var model = this.get('model');
var address = model.get('address');
console.log(
"model.get('isDirty')=", model.get('isDirty'), //false
"address.get('isDirty')=", address.get('isDirty') //true
);
address.revert();
model.revert();
}
}
在这里我们看到,当用户编辑地址(或者line1
或line2
)时,model
不被认为是“脏的”,因此ember-model
不会使适配器调用save()
。
发生这种情况,即使address
被认为是脏的,并且具有与 定义的关系model
。
这意味着我需要在两个对象上分别调用save
(或)。revert
因此我会失去操作的原子性,并且还需要为address
对象定义一个新的端点。我不想做这些。
我怎样才能确保更新address
也会model
变得肮脏?
更新:
我没有同时调用save
“子”和“父”对象,而是通过查看 ember-model 的源代码找到了一种更好的方法:
console.log(
"model.get('isDirty')=", model.get('isDirty'), //false
"address.get('isDirty')=", address.get('isDirty') //true
);
// model.get('address').save();
if (address.get('isDirty')) {
model._relationshipBecameDirty('address');
}
console.log(
"model.get('isDirty')=", model.get('isDirty'), //true
"address.get('isDirty')=", address.get('isDirty') //true
);
model.save();
这确保了原子性得以保留,但是像这样直接调用私有方法似乎并不正确。有没有更好的办法?
目前这种方法的唯一用途_relationshipBecameDirty
——has_many_array.js
在 ember-model 中,我无法在belongs_to.js
. 如果这是在 meber 模型中有意设计的,那么实现此目的的正确方法是什么?