如何序列化余烬分页数据 [英] How to serialize ember paginated data

查看:69
本文介绍了如何序列化余烬分页数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从我的其余API中获取了json:

I am getting following json from my rest API:

{
  "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()
});

Ember路线

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网络选项卡中,我可以看到响应,但是在浏览器控制台中,我收到以下消息:

In the Firefox network tab i can able to see the response but in browser console i am getting the following message:

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

Error while processing route: book.index data is undefined _pushInternalModel

在Chrome中出现以下异常:

In Chrome getting following exception:

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

ember.debug.js:30610 Error while processing route: books.index Cannot read property 'type' of undefined TypeError: Cannot read property 'type' of undefined

我正在使用以下版本的余烬:

I am using following versions of ember:

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

我认为我应该使用"normalizeResponse"序列化响应,但是我不知道该怎么做.

I think i should serialize the response using "normalizeResponse" but i don't know how to do it.

根据 Lux 注释更改了序列化程序:

As per Lux comment changed serializer :

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)

推荐答案

您应查看文档.

我认为您将必须实现 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认为您需要为其提供其他记录,但找不到它们的类型.

included are other included records. Informations like pagination data should be in the meta hash. So ember is thinking you provide it with additional records, but can't find the type of them.

接下来,您将实现 normalizeArrayResponse .可能这样的事情将为您工作:

Next you implement normalizeArrayResponse. Probably something like this will work for you:

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 数组中提取数据.

This is to extract your data from the content array.

这篇关于如何序列化余烬分页数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆