名为" type"在Ember数据中使用RESTSerializer的嵌入式记录 - 错误未找到模型

时间:2015-07-02 15:09:38

标签: rest serialization ember.js ember-data

我使用Ember Data 1.13.4。

我有一个带有一些嵌入式记录的模型,让我们说它们看起来像这样:

var Partner = DS.Model.extend({
  name: DS.attr(),
  addresses: DS.hasMany('address', { async: false } ),
});

var Address = DS.Model.extend({
  type: DS.attr(),
  zip: DS.attr(),
  city: DS.attr(),
  street: DS.attr()
});

API会发回Address条记录中嵌入的Partner条记录。回复示例:

{
  "partners": [
    {
      "id": 47,
      "name": "Johnny",
      "addresses": [
        {
          "id": 7,
          "type": "MAIN",
          "zip": "1234",
          "city": "City-X",
          "street": "6. Nowhere"
        }
      ],
    },
  ]
}

问题是type模型上的Address只是一个普通属性,但Ember Data希望它是嵌入模型的类型,我得到这个断言消息:

Error: No model was found for 'MAIN' 

其中'MAIN'type属性的内容。

我无法改变API发送数据的方式,我需要适应它。

我该怎么做?

编辑:我第一次忘记包含的重要细节。 API有一个/partners/search端点,我使用直接ajax请求访问,然后我(据说)需要调用this.store.pushMany('partner', this.store.normalize('partner', response.partners));这就是No model was found for 'MAIN'被引发的时候。

1 个答案:

答案 0 :(得分:0)

您的{ partners: { addresses: [ ... ] } }正在返回嵌入数据,但由于您提供的对象包含idtype ember-data,因此了解api会返回多态关联。并试图找到一个名为MAIN的模型,但由于它不存在Error: No model was found for 'MAIN',所以会引发它。

为了告诉ember-data您的关系是否已嵌入,您需要覆盖PartnerSerializer并添加DS.EmbeddedRecordsMixin

App.ApplicationAdapter= DS.RESTAdapter;
App.ApplicationSerializer = DS.RESTSerializer;
App.PartnerSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    addresses: { embedded: 'always' }
  }
}) 

此示例的实时演示http://emberjs.jsbin.com/nufofehota/1/edit?html,js,output