在烬串行器上定义自定义根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

+0

谢谢@Timm。它的工作:) –