2 つのモデルが与えられた場合、「子」オブジェクトへの更新によって「親」オブジェクトが「ダーティ」としてマーク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
でも発生します。
これは、2 つのオブジェクトで個別に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
。これがメンバーモデルの設計による意図的なものである場合、これを達成する適切な方法は何ですか?