在服务器上存储emberjs hasMany模型?

时间:2018-06-25 11:07:52

标签: ember.js ember-data

这是我当前拥有的模型结构

// match.js
import DS from 'ember-data';

export default DS.Model.extend({
    name: DS.attr('string'),
    match: DS.attr('number'),
    players: DS.hasMany('player')
});
//player.js
import DS from 'ember-data';

export default DS.Model.extend({
    pid: DS.attr('number'),
    match: DS.attr('number'),
    name: DS.attr('string'),
    point: DS.attr('number'),
    home: DS.attr('boolean'),
    squard: DS.belongsTo('squard'),
    selected: DS.attr('boolean', {default: false})
});

我在客户端创建了一个新的小分队,并通过以下代码使用推players s

let player - this.store.peekRecord('player', id);
let squard = this.store.peekRecord('squard', 1);
squard.get('players').pushObject(player);

我尝试使用squard.save(),但是并没有发送一系列的玩家信息。如何将这些更改推送到服务器?

2 个答案:

答案 0 :(得分:1)

如果要在保存小队时将完整的玩家列表推送到服务器,则需要使用余烬embedded-records mixin

创建一个小队适配器并将以下内容添加到其中。

import DS from 'ember-data';

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    players: { embedded: 'always' }
  }
});

这将导致玩家数组被序列化并包含在小队的有效载荷中。

答案 1 :(得分:1)

使用Trenton Trama的答案所建议的DS.EmbeddedRecordsMixin只能与DS.RESTSerializer一起使用,这不是默认值。

如果使用DS.JSONAPISerializer(它实现了JSON API specification并用作默认设置),则自定义shouldSerializeHasMany()是更好的方法。

请记住,有充分的理由不完全替代“多对多”的关系。符合JSON API的服务器可能根本不支持它:

  

注意:由于完全更换可能是非常危险的操作,因此服务器可能会选择不允许这样做。例如,如果服务器未向客户端提供关联对象的完整列表,并且不希望删除客户端未看到的记录,则服务器可能拒绝完全替换。 (Source