我有一个指向一个人的拨号器:
App.Dialer = DS.Model.extend({
created_at: DS.attr('date'),
person: DS.belongsTo('App.Person'),
didCreate: function() { alert('didCreate: ' + this + ', ' + this.get('person')); }
});
App.Person = DS.Model.extend({
name: DS.attr('string'),
dialers: DS.hasMany('App.Dialer')
});
我创建了一个新的拨号器:
var d = App.store.createRecord(App.Dialer, {
person: App.Person.find(1)
});
alert('before commit: ' + d + ', ' + d.get('person'));
App.store.commit();
alert('after commit: ' + d + ', ' + d.get('person'));
它在服务器上正确创建记录,并正确设置了person_id。调用commit()之前和之后的两个警告语句也可正常工作,并且dialer对象和它的person对象都被填充。
然而,在创建记录之后,当Ember调用我的didCreate事件处理程序时,人员关联已经消失,而当我调用this.get('person')时,我得到'null',即使值为'这是新的拨号程序对象,其ID与前两个警报相同。
答案 0 :(得分:1)
更新(PUT)
我发现204 No Content
的HTTP服务器响应(空主体)避免在多请求提交期间重置关联。
从历史上看,我更喜欢使用REST API来返回200 OK
更新的数据,但这是避免在提交过程中途污染客户端数据的明智选择。
适用于创建(POST)
在Dialer模型上,撰写回调以在事务完成后重新加载对象:
didCreate: function() {
// Re-GET the backing data to populate associations that were wiped out during nested creation.
Ember.run.next(this, function() {
this.get('store').findQuery(App.Dialer, { ids: [this.get('id')] });
});
}
它会导致额外的HTTP请求,并且还可能需要更改服务器以返回查询对象。对于我的Rails 3.2应用程序,我做了一个控制器动作,如:
def index
if Array===params[:ids]
@dialers = Dialer.find(params[:ids])
else
@dialers = []
end
render :index
end