Мне нужно настроить сериализатор в адаптере 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));
}
}