我有一个JSON-Api后端,我找不到用于处理继承对象的好方法,因为Route资源的名称是父类,但有效负载中的“ type”属性对应于子类。有效负载示例(GET / api / pets):
{
"data": [
{
"id": "1",
"type": "cat",
"attributes": {
"name": "Tom"
}
},
{
"id": "2",
"type": "dog",
"attributes": {
"name": "Max"
}
]
}
现在,我为它加载路线:
# app/routes/pets.js
import Route from '@ember/routing/route';
export default Route.extend({
model() {
return this.get('store').findAll('pet');
}
});
型号:
# app/models/pet.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string')
});
# app/models/cat.js
import DS from 'ember-data';
import Pet from './pet';
export default Pet.extend({
});
# app/models/dog.js
import DS from 'ember-data';
import Pet from './pet';
export default Pet.extend({
});
最后,我想在一个简单的页面上显示它们:
# app/templates/devices.hbs
<h3>Pets list</h3>
{{#each model as |pet|}}
<h4>{{pet.name}}</h4>
{{/each}}
该对象已被Route很好地加载(我在Ember检查器中看到了它们),但是没有Pet
对象,因此不会渲染它们。在这一点上,我不知道如何处理而不更改api结构。
答案 0 :(得分:2)
这将需要一些工作,但可能不会太糟。
首先,您需要创建一个Pet序列化程序:ember generate serializer pet
。
然后,您可以覆盖normalize
钩子,以根据响应中的属性返回不同的模型:
或者,如果狗/猫之间没有任何实际差异,则可以将type
移到同一标准化钩子的attribute字段中。