1

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

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',即使 'this' 的值是新的 dialer 对象,与前两个警报具有相同的 id。

4

1 回答 1

1

用于更新 (PUT)

我发现 HTTP 服务器响应204 No Content(带有空正文)避免在多请求提交期间重置关联。

从历史上看,我更喜欢 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
于 2012-09-23T23:52:37.123 回答