Ember-data: как обращаться с объектами наследования
У меня есть бэкэнд 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}}
Трасса хорошо загружена (я видел их с инспектором Ember), но нет Pet
объекты, поэтому они не отображаются. На данный момент я не знаю, как с этим справиться, не меняя структуру API.
1 ответ
Это займет немного работы, но, вероятно, не будет слишком плохо.
Сначала вам нужно создать сериализатор Pet: ember generate serializer pet
,
Тогда вы можете переопределить normalize
перехватить, чтобы вернуть другую модель на основе атрибутов в ответе:
Или, если между собаками / кошками нет реальных различий, вы можете просто переместить type
в поле атрибутов в том же крюке нормализации.