【问题标题】:EmbeddedRecordsMixin not working as expected, what am I missing?EmbeddedRecordsMixin 没有按预期工作,我错过了什么?
【发布时间】:2015-04-29 10:03:42
【问题描述】:

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

我有两个模型

app/models/video.js:

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

app/models/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);
  }
}

【问题讨论】:

  • 对 - 完全错过了 - 抱歉,我读得太快了,只专注于错误。EmbeddedRecordsMixin - 当然这是一个完整的记录..
  • 是的,我已经剥离了一堆东西来尝试专注于事业。一旦我找出导致错误的原因,转录模型将具有其他属性等

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


【解决方案1】:

问题在于您自己重新实现了extractSingle

如果你正在这样做,你应该打电话给this.super..

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

因为您没有调用 this.super 或手动调用 this.normalize,所以您错过了 mixin 正在做什么。

【讨论】:

  • 感谢您的建议,虽然转录需要是一系列模型
  • 我已经完全重写了我的答案并取消删除它 - 我相信这次我做对了(:
  • this._super(...arguments);
  • 而不是这样:{ id: data._id, title: data.Title, 转录:[{ id: "1" }] }
  • 如果您查看文档中的示例 - emberjs.com/api/data/classes/… - this._super() 中使用的有效负载如下所示:payload = { cmets: cmets, post: payload };
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2019-08-28
  • 2014-10-18
相关资源
最近更新 更多