Ember RESTAdapter - 模型中有许多关系 - 如何使用 POST 发送空数组?

Ember RESTAdapter - hasMany relationship in model - how to send empty array with POST?

Ember 菜鸟在这里 -

我有两个模型具有如下 hasMany 关系 -

var Season = DS.Model.extend({
    name: DS.attr('string'),
    periods: DS.hasMany('period', {
        async: false
    })
});

var Period = DS.Model.extend({
    from: DS.attr('date'),
    to: DS.attr('date'),
    season: DS.belongsTo('season')
});

季节可以没有任何时期 - 这就是我创建季节记录并保存的方式 --

        var season = this.store.createRecord('season', {
            name: name
        });

        season.save().then(function(season){
                   /* season saved */
        });

POST 请求负载如下所示 --

   {
    "season" : {
         "name" : "test"
     }
   }

但是后端 API 期望有效载荷是这样的——带有一个空的句点数组

    {
    "season" : {
         "name" : "test"
         "periods" : []
     }
   }

我该如何实现?

您需要通过修改序列化程序来更改 ember 发送到您的服务器的内容,您可以仅针对该模型覆盖 SeasonSerializerApplicationSerializer 来执行此操作宽

请参阅 API 文档的这一部分 http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_serialize

类似于:

App.SeasonSerializer = DS.RESTSerializer.extend({
  serialize: function(snapshot, options) {
    var json = this._super(snapshot, options);

    if(json.periods === undefined) {
      json.periods = [];
    }

    return json;
  }
});

如果您不能修改服务器,这应该可以解决问题:

App.SeasonSerializer = DS.RESTSerializer.extend({
  serialize: function(snapshot, options) {
    var json = this._super(snapshot, options);

    if (Ember.isEmpty(json.periods)) {
      json.periods = [];
    }

    return json;
  }
});

在一般情况下,您可以创建一个序列化程序,为所有空的 hasMany 关系发送 [ ]。

serializers/application.js:

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  serialize(snapshot, options) {
    var json = {};

    snapshot.eachAttribute(function(name) {
      json[name] = snapshot.attr(name);
    });

    snapshot.eachRelationship(function(name, relationship) {
      if (relationship.kind === 'hasMany') {
        const list = snapshot.hasMany(name, { ids: true });
        if(Ember.isEmpty(list)){
          json[name] = [];
        }else{
          json[name] = list;
        }
      }
    });

    return json;
  }
});