Ember.js - 将遗留JSON响应映射到数据模型

时间:2015-11-13 08:10:29

标签: json ember.js ember-data

我的遗留服务器JSON响应如下所示:

{ "foo": { … }, "bars": ["a", "b", "c", …] }

如何通过扩展RESTAdapter将其映射到Ember数据模型?

到目前为止,我最好的尝试如下:

app/models/rule-lookup.js:

import DS from 'ember-data';
export default DS.Model.extend({
  foo: DS.attr(),
  bars: DS.attr(),
});


app/models/foo.js:

import DS from 'ember-data';
export default DS.Model.extend({
  name: DS.attr('string'),
  description: DS.attr('string'),
});

当用户在选择中做出选择时,在控制器中我用以下内容获取模型:

this.store.findRecord('rule-lookup', id);

在适配器(application.js内)中,我提出了以下语句:

import DS from 'ember-data';
export default DS.RESTAdapter.extend({
  urlForFindRecord(id, modelName, snapshot) {
    switch (modelName) {
      case 'rule-lookup': {
        return `api/keys/${id}/rules/0/200`;
      }
    }
  },
});

使用findRecord的导入无声地失败,只有一个警告:

WARNING: Encountered "bars" in payload, but no model was found for model name "bar" (resolved model name using panel@serializer:rest:.modelNameFromPayloadKey("bars"))`
TypeError: Cannot read property '_internalModel' of undefined

我正在使用:

Ember      : 1.13.7
Ember Data : 1.13.8

1 个答案:

答案 0 :(得分:1)

过去我一直被这个问题所困扰。 “正确”的方法似乎是在模型的序列化器中覆盖extractnormalize等方法。 这是通过创建一个新文件来实现的,例如:

app/serializers/rule-lookup.js

中的

import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  // override here
});

但最终我无法使其发挥作用。

所以我通过改变服务器发出的“平坦”响应来解决它在“root”的问题:

{ "id": 1, "label": "something" }

为:

{ "rule-lookup": { "id": 1, "label": "something" } }