Ember,Ember Data - 更新有很多关系

时间:2015-08-23 22:29:44

标签: ember-data

我试图更新Ember中的hasMany关系,但我在使数据正确发送方面遇到了一些麻烦。

我有以下Ember型号:

// models/post.js
export default DS.Model.extend({
    title: DS.attr('string'),
    tags: DS.hasMany('tag', { async: true })
});

// models/tag.js
export default DS.Model.extend({
    title: DS.attr('string'),
    post: DS.belongsTo('post', { async: true })
});

然后我在我的路线中执行以下操作来创建新标记并更新帖子:

addTag: function() {
    var post = this.get('currentModel');

    var newTag = this.store.createRecord('tag', {
        title: 'Lorem Ipsum',
        post: post
    });

    newTag.save().then(function() {
        post.get('tags').pushObject(newTag);

        post.save();
    });
}

新标记已成功创建并由我的Express api保存,但帖子未正确保存。它由api接收但是Ember发出的请求有效负载从不包含标签ID(它确实发送了标签标题)。我究竟做错了什么?非常感谢任何帮助!

修改

事实证明,RESTSerializer默认不会序列化并包含hasMany关系的相关ID。它只包含了belongsTo方面的内容,因为它希望API能够在需要的地方保存它。我可能会更改我的API以适应此行为,因为它更有效但是如果遇到任何其他人,可以通过扩展序列化程序并使用DS.EmbeddedRecordsMixin使序列化程序包含ID mixin - http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html - 看起来像这样:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
    attrs: {
        tags: { serialize: 'ids' }
    }
});

2 个答案:

答案 0 :(得分:0)

您无需在帖子上调用.save()。当您调用createRecord创建标记时,您的后端会收到post的id,并应相应地保留依赖项。

addTag: function() {
    var post = this.get('currentModel');

    this.store.createRecord('tag', {
          title: 'Lorem Ipsum',
          post: post})
       .save()
       .then(function(tag) {
          post.get('tags').pushObject(tag);
       });

答案 1 :(得分:0)

遇到同样的问题。

目前我通过serializeHasMany hook解决了这个问题。

// app/serializers/application
import {ActiveModelSerializer} from 'active-model-adapter';

export default ActiveModelSerializer.extend({
  serializeHasMany: function(snapshot, json, relationship){
    this._super.apply this, arguments
    if (!json[relationship.type + '_ids']){
      var ids = []
      snapshot.record.get(relationship.key).forEach(function(item){
        ids.push item.get 'id'
      });
      json[relationship.type + '_ids'] = ids
    }
  }
})