灰烬数据:如何处理继承对象

时间:2018-08-16 15:37:17

标签: ember.js ember-data json-api ember-3

我有一个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结构。

1 个答案:

答案 0 :(得分:2)

这将需要一些工作,但可能不会太糟。

首先,您需要创建一个Pet序列化程序:ember generate serializer pet

然后,您可以覆盖normalize钩子,以根据响应中的属性返回不同的模型:

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

或者,如果狗/猫之间没有任何实际差异,则可以将type移到同一标准化钩子的attribute字段中。

相关问题