1

我有一个 JSON-Api 后端,但我找不到处理继承对象的好方法,因为 Route 资源名称是父类,但有效负载中的“类型”属性对应于子类。有效负载示例(GET /api/pets):

{
    "data": [
        {
            "id": "1",
            "type": "cat",
            "attributes": {
                "name": "Tom"
            }
        },
        {
            "id": "2",
            "type": "dog",
            "attributes": {
                "name": "Max"
        }
    ]
}

现在,我使用 Route 加载它:

# 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结构。

4

1 回答 1

2

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

首先你需要创建一个 Pet 序列化器:ember generate serializer pet.

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

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

或者,如果狗/猫之间没有任何实际差异,您可以将 移动type到同一规范化钩子中的属性字段中。

于 2018-08-16T21:05:10.383 回答