我的遗留服务器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
答案 0 :(得分:1)
过去我一直被这个问题所困扰。
“正确”的方法似乎是在模型的序列化器中覆盖extract
和normalize
等方法。
这是通过创建一个新文件来实现的,例如:
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" } }