我使用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'
被引发的时候。
答案 0 :(得分:0)
您的{ partners: { addresses: [ ... ] } }
正在返回嵌入数据,但由于您提供的对象包含id
和type
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