【问题标题】:Ember-data: How to deal with inheritance objectsEmber-data:如何处理继承对象
【发布时间】:2023-03-16 18:25:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我创建了一个Pet 序列化程序,但显然它只适用于Pet 对象。但是,如果我创建一个Cat 序列化程序,我可以成功地将type 更改为Pet,但这意味着为我必须处理的每个子类创建一个序列化程序。
    • 您可以为“应用程序”创建一个序列化程序并重用它,或者创建一个并从特定的序列化程序扩展它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2012-07-19
    • 1970-01-01
    • 2013-08-08
    • 2013-03-12
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多