2017-05-08 1 views
1

emberを使用してREST APIからブランドアイテムを取得しようとしています。私のAPIレスポンスはember-dataと一致しません。例えば:emberシリアライザでカスタムルートjsonノードを定義します

マイモデル:

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    isActive: DS.attr('boolean') 
}); 

私のAPIのURL: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" 

}] 

私はブランドと呼ばれるシリアライザのルートjsonノードを変更しようとしています。私はそれを動作させることはできません。 :(

ここに私のシリアライザ/ brand.js

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 

}); 

と私のアダプタ/ブラウザのコンソール上

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' 
}); 

をapplication.jsこのメッセージが表示されます:

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")) 

どのようにすることができます私は正確なデータがどこにあるのかと尋ねます。助けていただければ幸いです。

私の英語がうまくない場合は申し訳ありません。

答えて

1

すでに行ったように、すべてのモデルの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

ありがとうございます@ティム。その作業:) –

関連する問題