【问题标题】:How to serialize ember paginated data如何序列化 ember 分页数据
【发布时间】:2016-10-05 14:16:03
【问题描述】:

我正在从我的其余 API 获取以下 json:

{
  "content": [{
    "id": 56789,
    "name": "sample book",
    "status": "available"
  },{
    "id": 56789,
    "name": "sample book",
    "status": "available"
  }],
  "last": true,
  "totalElements": 5,
  "totalPages": 2,
  "size": 3,
  "number": 1,
  "sort": null,
  "first": false,
  "numberOfElements": 2
}

Ember Book 模型

export default DS.Model.extend({
  id: DS.attr(),
  name: DS.attr(),
  status: DS.attr()
});

灰烬路线

import Ember from 'ember';
import RouteMixin from 'ember-cli-pagination/remote/route-mixin';

export default Ember.Route.extend(RouteMixin, {

  model: function(params) {
      params.paramMapping = {
        perPage: "size"
      };
      return this.findPaged('book',params);
  }
});

在 Firefox 网络选项卡中,我可以看到响应,但在浏览器控制台中,我收到以下消息:

处理路由时出错:book.index 数据未定义_pushInternalModel

在 Chrome 中出现以下异常:

ember.debug.js:30610 处理路由时出错:books.index 无法读取未定义的属性“类型”TypeError:无法读取未定义的属性“类型”

我正在使用以下版本的 ember:

  • "ember-cli": "2.5.0",
  • "ember-cli-pagination": "2.2.2"

我认为我应该使用“normalizeResponse”序列化响应,但我不知道该怎么做。

根据 Lux 评论更改了序列化程序:

import JSONSerializer from 'ember-data/serializers/json';
import DS from'ember-data';

export default DS.JSONSerializer.extend(DS.EmbeddedRecordsMixin, {
attrs: {
    product: {embedded: 'always'}
},
extractMeta(store, typeClass, payload) {
  let meta = [{
  "last": payload.last,
  "totalElements": payload.totalElements,
  "totalPages": payload.totalPages,
  "size": payload.size,
  "number": payload.number,
  "sort": payload.sort,
  "first": payload.first,
  "numberOfElements": payload.numberOfElements
}];
delete payload.content;
delete payload.last;
delete payload.totalElements;
delete payload.totalPages;
delete payload.size;
delete payload.number;
delete payload.sort;
delete payload.first;
delete payload.numberOfElements;

return meta;
},
normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
let documentHash = {
  data: [],
  included: [],
  meta: this.extractMeta(store, primaryModelClass, payload),
};
payload.content.forEach(item => {
  let { data, included } = this.normalize(primaryModelClass, item);
if (included) {
  documentHash.included.push(...included);
}
documentHash.data.push(data);
});
}
});

出现以下错误:

ember.debug.js:19750 TypeError: Cannot read property 'forEach' of undefined
at Class.normalizeArrayResponse (device.js:41)
at Class.normalizeQueryResponse (json.js:333)
at Class.normalizeResponse (json.js:228)

【问题讨论】:

  • 您的有效负载应该采用这种格式 - stackoverflow.com/a/39725260/5771666 您需要将响应标准化为 JSONAPI 格式标准。在 normalizeResponse 方法中,如果您打印有效负载,那么它应该是上述格式
  • @kumkanillam 感谢您的回复。是的,我希望我发布的代码完全遵循您共享的格式,但仍然没有运气。如果我做错了什么,请纠正我。除了数据我把它放在“包含”属性中的其他属性很少。请指导我解决问题
  • 也许您可以尝试从 JSONSerializer 更改为 RESTSerializer ..(github.com/emberjs/data/pull/4259) 抱歉,我对 ember-data 的工作不多...我希望有人能指导您...

标签: ember.js ember-data ember-cli ember-cli-addons ember-cli-rails


【解决方案1】:

你应该checkout the documentation

我认为你必须实现extractMeta

extractMeta(store, typeClass, payload) {
  let meta = [{
    "last": payload.last,
    "totalElements": payload.totalElements,
    "totalPages": payload.totalPages,
    "size": payload.size,
    "number": payload.number,
    "sort": payload.sort,
    "first": payload.first,
    "numberOfElements": payload.numberOfElements
  }];
  delete payload.content;
  delete payload.last;
  delete payload.totalElements;
  delete payload.totalPages;
  delete payload.size;
  delete payload.number;
  delete payload.sort;
  delete payload.first;
  delete payload.numberOfElements;

  return meta;
}

included 是其他包含的记录。分页数据等信息应该在meta 哈希中。所以 ember 认为您向它提供了额外的记录,但找不到它们的类型。

接下来你实现normalizeArrayResponse。可能这样的东西对你有用:

normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
  let documentHash = {
    data: [],
    included: [],
    meta: this.extractMeta(store, primaryModelClass, payload),
  };

  payload.content.forEach(item => {
    let { data, included } = this.normalize(primaryModelClass, item);
    if (included) {
      documentHash.included.push(...included);
    }
    documentHash.data.push(data);
  });
}

这是从content 数组中提取您的数据。

【讨论】:

  • 你用的是 JSONSerializer 还是 JSONAPISerializer 哪个序列化器?
  • 这显然是基于JSONSerializer。我已经链接到它了。
  • 感谢您的回复。我在“normalizeArrayResponse”中将 Payload 设为空
  • 我解决了序列化问题,您正在删除引发错误的 extractMeta 函数中的内容,解决该问题后,我得到“无法读取未定义类型错误的属性“类型”:无法读取属性“类型” undefined" 屏幕错误。请您指导我解决此问题
  • 在调试“documentHash.data.push(data);”时属性和关系对象为空。只有原型对象可用。想知道可能是什么问题?
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2016-02-06
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2012-09-29
相关资源
最近更新 更多