在烬串行器上定义自定义根json节点
问题描述:
我试图从我的REST API中使用烬来获取品牌项目;但我的API响应与预期的烬数据不匹配。例如:在烬串行器上定义自定义根json节点
我的模型:
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
isActive: DS.attr('boolean')
});
我的API网址:http://localhost:3000/api/brands 与响应:
{"success":true,
"data":[
{"id":1,"name":"Mine","isActive":true,"createdAt":"2017-04-23T20:36:49.000Z","updatedAt":"2017-04-23T20:44:32.000Z"},
{"id":2,"name":"forever","isActive":true,"createdAt":"2017-04-23T20:41:14.000Z","updatedAt":"2017-04-23T20:43:57.000Z"}
]
}
但是,灰烬期待一些这样的:
"brands": [{
"id": 1,
"name": "foo",
"isActive": "foo"
}]
我正在尝试更改序列化器中名为brand的根json节点。 JS,但我不能让它工作。 :(
这里我串行器/ brand.js
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
});
和我的适配器/ application.js中
import DS from 'ember-data';
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';
import config from '../config/environment';
export default DS.RESTAdapter.extend(DataAdapterMixin, {
host: `${config.host}`,
namespace: `${config.namespace}`,
authorizer: 'authorizer:custom'
});
浏览器控制台上显示这样的信息:
WARNING: Encountered "success" in payload, but no model was found for model name "success" (resolved model name using [email protected]:brand:.modelNameFromPayloadKey("success"))
WARNING: Encountered "data" in payload, but no model was found for model name "datum" (resolved model name using [email protected]:brand:.modelNameFromPayloadKey("data"))
哪有我说呃,在正确的数据是在哪里?。有些帮助表示赞赏。
对不起,如果我的英文不好。
答
正如您已经这样做了,您可以覆盖每个模型的RESTSerializer。
你想实现的是响应规范化。你可以在你的串行器(see the docs)覆盖normalizeResponse
正常化你的回应:
import Ember from 'ember';
import DS from 'ember-data';
const {
RESTSerializer
} = DS;
const {
get
} = Ember;
export default RESTSerializer.extend({
normalizeResponse(store, primaryModelClass, payload, id, requestType) {
// Only do normalization for reading:
if(requestType !== 'createRecord' && requestType !== 'updateRecord' && requestType !== 'deleteRecord') {
// Do your normalization here. For example (not tested):
payload = {
brands: get(payload, 'data')
};
}
return this._super(store, primaryModelClass, payload, id, requestType);
}
});
取而代之的首要normalizeResponse
,你也可以覆盖other normalization methods。
谢谢@Timm。它的工作:) –