Как сериализовать разбитые на угли данные
Я получаю следующие JSON из моего остальных 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 Model
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 Невозможно прочитать свойство 'type' из неопределенного TypeError: Невозможно прочитать свойство 'type' из неопределенного
Я использую следующие версии 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)
1 ответ
Вы должны проверить документацию.
Я думаю, что вы должны были бы реализовать 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
массив.