Как сериализовать данные Ember с разбивкой на страницы

Я получаю следующий 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

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)

person VelNaga    schedule 05.10.2016    source источник
comment
ваша полезная нагрузка должна быть в этом формате - stackoverflow.com/a/39725260/5771666 вам нужно нормализовать свои ответы в формате JSONAPI стандарт. В методе normalizeResponse, если вы печатаете полезную нагрузку, она должна быть в вышеупомянутом формате.   -  person Ember Freak    schedule 05.10.2016
comment
@kumkanillam спасибо за ваш ответ. да, я надеюсь, что код, который я разместил, точно соответствует формату, которым вы поделились, но все равно не повезло. пожалуйста, поправьте меня, если я что-то делаю неправильно. кроме данных, у меня есть несколько других атрибутов, которые я поместите его внутрь включенных атрибутов. Пожалуйста, помогите мне решить проблему   -  person VelNaga    schedule 05.10.2016
comment
Может быть, вы можете попробовать перейти с JSONSerializer на RESTSerializer..(github.com/emberjs/data/pull /4259) извините, чувак, я мало работал с ember-data... надеюсь, кто-нибудь поможет тебе...   -  person Ember Freak    schedule 05.10.2016


Ответы (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.

person Lux    schedule 05.10.2016
comment
какой сериализатор вы используете JSONSerializer или JSONAPISerializer? - person VelNaga; 06.10.2016
comment
Это, очевидно, основано на JSONSerializer. Я связался с ним. - person Lux; 06.10.2016
comment
спасибо за ваш ответ. Я получаю Payload как пустую внутри normalizeArrayResponse - person VelNaga; 06.10.2016
comment
я решил проблему сериализации, которую вы удаляете из содержимого внутри функции extractMeta, которая выдает ошибку. После решения проблемы я получаю Невозможно прочитать тип свойства неопределенной ошибки TypeError: Невозможно прочитать свойство 'тип' неопределенной ошибки на экране. Не могли бы вы помочь мне решить эту проблему - person VelNaga; 07.10.2016
comment
при отладке documentHash.data.push(data); Атрибуты и объекты отношений пусты. Доступен только объект-прототип. Интересно, в чем может быть проблема? - person VelNaga; 07.10.2016
comment
После выполнения normalizeArrayResponse Ember выполняет normalizeResponse внутри, он снова вызывает extractMeta, который делает все мета-атрибуты нулевыми, поскольку мы удаляем все атрибуты в аналогичных атрибутах normalizeArrayResponse и объектах Relationships также нулевыми. Вы знаете, как это решить? - person VelNaga; 07.10.2016
comment
После normalizeArrayResponse он запускает _normalizeResponse, который делает или переопределяет наш мета-атрибут и атрибут данных как пустой. Это странно. - person VelNaga; 07.10.2016