Как отправить данные в хранилище Ember модели, в которой есть JSONSerializer, так как его Serializer содержит JSONAPISerializer или RESTSerializer в Ember js? - PullRequest
0 голосов
/ 31 августа 2018

Для модели, которая использует JSONAPISerializer в качестве Сериализатора, выдвигающего запись для этой модели

в хранилище осуществляется store.push (dataInJSONAPISerializerFormat)

https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/push?anchor=push

method.But для модели, которая использует RESTSerializer в качестве Сериализатора, выдвигающего запись для этого

модель в хранилище выполняется с помощью store.pushPayload ("modelName", dataInRESTSerializerFormat)

https://www.emberjs.com/api/ember-data/3.3/classes/DS.Store/methods/pushPayload?anchor=pushPayload способ.

Но если JSONSerializer, они оба не работают? Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 31 августа 2018

Вы неправильно поняли разницу между push и pushPayload методами DS.Store.

Метод push "используется для уведомления хранилища Ember Data о новых или обновленных записях, существующих в серверной части." Ожидается нормализованный JSON API . документ ". Нормализованный означает, что он должен не только соответствовать спецификации JSON API , но и следовать некоторым даже более строгим соглашениям.

Если ваша полезная нагрузка еще не является нормализованным документом JSON API , вам необходимо преобразовать его в некоторые. Обычно это делается сериализатором. Не имеет значения, является ли этот сериализатор расширенным DS.JSONSerializer , DS.RestSerializer или только базовым DS.Serializer классом. Даже если вы используете DS.JSONAPISerializer , вам может потребоваться сериализовать полезную нагрузку, если она не нормализована (например, type не является множественным числом).

pushPayload метод "- это удобная оболочка для store # push, которая десериализует полезные нагрузки" . Так что это не более чем применение Serializer к предоставленным данным и отправка нормализованных данных в хранилище.

Сериализатор должен поддерживать store.pushPayload() путем реализации метода pushPayload(). Не все сериализаторы, поставляемые с Ember Data, поддерживают его «из коробки». DS.JSONSerializer нет. Вы можете реализовать это или просто вызвать normalizeResponse() напрямую и передать нормализованный ответ на store.push(). Реализация pushPayload может быть или не быть сложной в зависимости от конкретной реализации API и вариантов использования, которые вы хотите поддерживать, так как вам необходимо знать класс первичной модели и тип запроса. В зависимости от вашего API эта информация может быть или не быть доступной в вашей полезной нагрузке.

Обратите внимание, что в настоящее время ведутся дискуссии об устаревшем pushPayload: https://github.com/emberjs/rfcs/issues/357. Это может быть еще одним аргументом в пользу того, чтобы не реализовывать пользовательское решение для вашего DS.JSONSerializer, а использовать serializer.normalizeResponse() и store.push().

...