在createRecord()之后关联消失

时间:2012-09-22 05:37:14

标签: ember.js

我有一个指向一个人的拨号器:

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与前两个警报相同。

1 个答案:

答案 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