EmbeddedRecordsMixin没有按预期工作,我缺少什么?

时间:2015-04-29 10:03:43

标签: ember.js ember-data ember-cli

我正在尝试在ember数据中使用嵌入式记录,我想我缺少一些基本的东西。

我有两个型号

应用程序/模型/了Video.js:

export default DS.Model.extend({
  title: DS.attr('string'),
  transcriptions: DS.hasMany('transcription', { embedded: 'always' })
});

应用程序/模型/ transcription.js:

export default DS.Model.extend({
  video: DS.belongsTo('video')
});

我还有一个自定义序列化程序app / serializers / video.js:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs:{
    transcriptions: { embedded: 'always' }
  },  
  extractSingle: function (store, type, payload, id) {
    var data = payload.data;
    return {
      id: data._id,
      title: data.Title,
      transcriptions: [{ id: "1" }] 
    }
  }
});

我希望这会导致我的视​​频模型填充转录是一个转录对象数组,但我得到以下错误:

  

“处理路径时出错:videos.show”“断言失败:Ember   数据需要一个数字或字符串来表示中的记录   而transcriptions关系却发现了一个对象。如果这是一个   多态关系请指定type键。如果这是一个   嵌入式关系请包括DS.EmbeddedRecordsMixin和   在序列化程序的attrs中指定transcriptions属性   对象“。

对于我在这里做错了什么建议我将不胜感激。

更新:解决方案是将我的自定义序列化程序修改为以下内容:

export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs:{
    transcriptions: { embedded: 'always' }
  },  
  extractSingle: function (store, type, payload, id) {
    var data = payload.data;

    var videoPayload = {
      id: data._id,
      title: data.Title,
      transcriptions: [{ id: "1" }] 
    };

    return this._super(store, type, videoPayload, id);
  }
}

1 个答案:

答案 0 :(得分:1)

问题在于你自己重新实现extractSingle

如果你这样做,你应该致电this.super

在REST序列化程序的extractSingle中,它调用normalize函数 - 这个normalise函数是EmbeddedRecordsMixin完成所有工作的地方。

由于您没有拨打this.super或手动拨打this.normalize,因此您错过了mixin正在做的事情。