5

与えられたモデル:

Blog.Post = DS.Model.extend({
    title: DS.attr('string'),
    tags:  DS.hasMany('Blog.Tag', { embedded: true })
});

Blog.Tag = DS.Model.extend({
    foo: DS.attr('string'),
    bar: DS.attr('string')
});

そしてインスタンス:

var myPost = Blog.Post.createRecord({ id: 45, title: 'Foo Bar' })

myPost.store.commit()(ember-dataのDS.RESTAdapterを介して)行うと、サーバーは、に適用する必要がある自動生成されたタグのリストを返しますmyPost。レスポンス json の例:

{
  posts: [
    {
      id: 45,
      title: 'Foo Bar',
      tags: [
        { id: 1, foo: 'bar1' },
        { id: 2, foo: 'bar2' }
      ]
    }
  ]
}

myPostjson によって返される 2 つのタグで終わると思いますが、代わりに次のエラーが発生します。

Error: <DS.StateManager:ember448> could not respond to event invokeLifecycleCallbacks in state rootState.loaded.updated.uncommitted.

ここで何が間違っていますか?

編集: @MikeAski のコメントごとに id を含めるように json を明確にしました。与えられた例は、私の実際のケースの単純化されたバージョンです。実際のケースにはタグ ID が含まれています。

4

1 に答える 1

0

まず、モデル間の関係を「ミラーリング」する必要があります。

   Blog.Post = DS.Model.extend({
        title: DS.attr('string'),
        tags:  DS.hasMany('Blog.Tag', { embedded: always })
    });

    Blog.Tag = DS.Model.extend({
        foo: DS.attr('string'),
        bar: DS.attr('string'),
        post: DS.belongsTo('Blog.Post')
    });

次に、アダプターにマッピングを追加する必要があります。

Blog.RESTSerializer = DS.RESTSerializer.extend({
  init: function() {
    this._super();

    this.map('Blog.Post',{
      tag:{embedded:'always'},
    });
  }
});

JSON の Tag に post_id を追加します。

于 2013-02-13T15:02:12.307 に答える