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 перехватить, чтобы вернуть другую модель на основе атрибутов в ответе:

https://emberjs.com/api/ember-data/3.3/classes/DS.JSONAPISerializer/methods/normalize?anchor=normalize

Или, если между собаками / кошками нет реальных различий, вы можете просто переместить type в поле атрибутов в том же крюке нормализации.

Другие вопросы по тегам