Вы неправильно поняли разницу между 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()
.