-1

Я получаю следующий JSON из моего отдыха API:Как сериализовать Ember разбивается на страницы данных

{ 
    "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 
} 

Эмбер Книга Модель

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 способный видеть реакцию, но в консоли браузера, я получаю следующее сообщение:

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

В Chrome получает следующее исключение:

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

Я использую следующие версии уголек:

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

Getting следующие ошибки:

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) 
+0

Ваша полезная нагрузка должна быть в таком формате - http://stackoverflow.com/a/39725260/5771666, вам необходимо нормализовать ваши ответы на стандарт формата JSONAPI. В normalizeResponse метод, если вы печатаете полезную нагрузку, тогда он должен быть в вышеупомянутом формате – kumkanillam

+0

@kumkanillam спасибо за ваш ответ. Я надеюсь, что код, который я отправил, точно соответствует формату, который вы поделили, но все равно не повезло.Пожалуйста, исправьте меня, Я делаю неправильно. Кроме данных, у меня есть несколько других атрибутов, которые я помещаю внутри атрибутов «включено». Пожалуйста, помогите мне решить проблему. – VelNaga

+0

Может быть, вы можете попробовать перейти с JSONSerializer на RESTSerializer .. (https://github.com/emberjs/data/pull/4259) извините, что я не много работал с данными ember. ..Я надеюсь, что кто-то проведет вас ... – kumkanillam

ответ

0

Вы должны 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 массива.

+0

Какой сериализатор вы используете JSONSerializer или JSONAPISerializer? – VelNaga

+0

Это, очевидно, основывается на 'JSONSerializer'. Я связался с ним. – Lux

+0

Благодарю вас за ответ. Я получаю полезную нагрузку как пустую внутри «normalizeArrayResponse» – VelNaga

Смежные вопросы