鉴于两种模式,我如何确保更新"孩子"对象标记"父母"反对"脏"这样在父对象上调用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
不被视为&#34;脏&#34;,因此ember-model
不会使适配器调用save()
。
即使address
被认为是脏的,并且其关系定义为model
,也会发生这种情况。
这意味着我需要分别在两个对象上调用save
(或revert
)。因此,我将失去操作的原子性,还需要为address
对象定义新的端点。我不想做其中任何一个。
如何确保更新address
也会使model
变得脏?
而不是在&#34;孩子&#34;上调用save
。和父母&#34;对象,我通过查看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模型中的故意设计,那么实现这个目标的正确方法是什么?
答案 0 :(得分:0)
首先,我包括DS.hasOne('person')
,假设两个人没有相同的地址(并且他们的地址同时发生变化)。并且不需要ID字段,它们是隐含的。
您必须调用私有方法,因为您所做的事情对RESTful数据库没有意义。你改变了地址,而不是那个人!如果你想更新ie。对于Person的updated_at时间戳,您希望在更新地址时在服务器上执行此操作。人的所有属性都没有改变,所以ember说对,记录不是很脏。
如果您要创建新的地址记录,则首先要保存地址,然后将新ID设置为此人,然后保存人员(这将是脏的)。在这种情况下,您可能最好将belongsTo人员放在地址上。