【问题标题】:Define custom root json node on ember serializer在 ember 序列化程序上定义自定义根 json 节点
【发布时间】:2017-05-08 02:40:28
【问题描述】:

我正在尝试使用 ember 从我的 REST API 中获取品牌项目;但我的 API 响应与预期的 ember-data 不匹配。例如:

我的模特:

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"}
    ]
}

但是,Ember 期待这样的结果:

"brands": [{

    "id": 1,
    "name": "foo",
    "isActive": "foo"

}]

我正在尝试更改名为 brand.js 的序列化程序中的根 json 节点,但无法使其正常工作。 :(

这是我的序列化程序/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 vanely-web@serializer:brand:.modelNameFromPayloadKey("success"))
WARNING: Encountered "data" in payload, but no model was found for model name "datum" (resolved model name using vanely-web@serializer:brand:.modelNameFromPayloadKey("data"))

我怎样才能告诉 ember 正确的数据在哪里?。感谢您的帮助。

如果我的英语不好,请见谅。

【问题讨论】:

    标签: javascript ember.js ember-data ember-cli


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2014-10-31
      • 2011-02-25
      • 2017-07-10
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多