如何序列化余烬分页数据 [英] How to serialize ember paginated data
问题描述
我从我的其余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屋!