如何使用store.commit()的响应json更新DS.Model?

ard*_*ell 5 ember.js ember-data

鉴于模型:

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')
});
Run Code Online (Sandbox Code Playgroud)

而实例:

var myPost = Blog.Post.createRecord({ id: 45, title: 'Foo Bar' })
Run Code Online (Sandbox Code Playgroud)

当我这样做时myPost.store.commit()(通过ember-data的DS.RESTAdapter),我的服务器返回一个应该应用的自动生成标签的列表myPost.示例响应json:

{
  posts: [
    {
      id: 45,
      title: 'Foo Bar',
      tags: [
        { id: 1, foo: 'bar1' },
        { id: 2, foo: 'bar2' }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我希望这myPost最终会得到json返回的两个标签,但我得到了这个错误:

Error: <DS.StateManager:ember448> could not respond to event invokeLifecycleCallbacks in state rootState.loaded.updated.uncommitted.
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

编辑:澄清json以包含每个@ MikeAski评论的ID.给出的示例是我的实际案例的简化版本 - 实际案例包括标签ID.

xam*_*rax 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')
    });
Run Code Online (Sandbox Code Playgroud)

然后您需要将映射添加到您的适配器:

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

    this.map('Blog.Post',{
      tag:{embedded:'always'},
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

并将 post_id 添加到 JSON 中的标签。