Мне нужно настроить сериализатор в адаптере ember.js

Моему серверу нужен json в формате ниже при отправке запроса PUT. Мой сервер - это api отдыха, разработанный с использованием плагина struts2 rest.

{
id: "5",
empId: "5",
firstName: "oki", 
lastName: "iko", 
edQual: "phd"
}
but the RESTAdapter serializes it to
[
employees:
 {
  id: "5", 
  empId: "5", 
  firstName: "oki", 
  lastName: "iko",
  edQual: "phd"
 }
]

Я попытался игнорировать свойства в бэкэнде, но он просто проигнорировал весь json и отправил нулевые значения на sql-сервер. Мне нужно переопределить или настроить сериализацию ember.js, но я не знаю как.

1 ответ

Решение

Это одна из обязанностей сериализатора, предоставляемого Ember Data. Я думаю, вы используетеRestSerializer, который обычно используется вместе с RestAdapterне так ли? В этом случае вам следует настроить serializeIntoHash()метод. Чтобы не использовать пространство имен вообще, нужно:

import RESTSerializer from '@ember-data/serializer/rest';

export default RESTSerializer.extend({
  serializeIntoHash(data, type, record, options) {
    data = this.serialize(record, options);
  }
});

Чтобы не потерять данные, которые уже есть на hash вы могли бы использовать Object.assign(). Это также то, что сделано в JSONSerializer:

import { assign, merge } from '@ember/polyfills';

const emberAssign = assign || merge;

export default RESTSerializer.extend({
  serializeIntoHash(hash, typeClass, snapshot, options) {
    emberAssign(hash, this.serialize(snapshot, options));
  },
});

В assign || mergeтребуется только для поддержки очень старых версий ember. Вы можете упростить:

import { assign } from '@ember/polyfills';

export default RESTSerializer.extend({
  serializeIntoHash(hash, typeClass, snapshot, options) {
    assign(hash, this.serialize(snapshot, options));
  },
});

Вам не нужно использовать полифилл для assign если вы не поддерживаете IE 11. В этом случае это будет:

export default RESTSerializer.extend({
  serializeIntoHash(hash, typeClass, snapshot, options) {
    Object.assign(hash, this.serialize(snapshot, options));
  },
});

А с родным классом это выглядит так:

export default class ApplicationSerializer extends RESTSerializer {
  serializeIntoHash(hash, typeClass, snapshot, options) {
    Object.assign(hash, this.serialize(snapshot, options));
  }
}
Другие вопросы по тегам