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() を呼び出す前後の 2 つのアラート ステートメントも正しく機能し、dialer オブジェクトとその person オブジェクトの両方が取り込まれます。

ただし、レコードが作成された後、Ember が didCreate イベント ハンドラーを呼び出すと、人物の関連付けが消えてしまい、代わりに this.get('person') を呼び出すと、'this' の値が最初の 2 つのアラートと同じ ID を持つ新しいダイヤラ オブジェクト。

4

1 に答える 1

1

更新用 (PUT)

204 No Content(本文が空の)の HTTP サーバー応答は、複数要求のコミット中に関連付けをリセットすることを回避することがわかりました。

歴史的には、REST API200 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 に答える