我需要在 ember.js 适配器中自定义序列化程序

I need to Customize the serializer in ember.js Adapter

我的服务器在发送 PUT 请求时需要 json 以下格式。 我的服务器是使用 struts2 rest 插件设计的 rest api。

{
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 的序列化,但我不知道该怎么做。

这是 Ember Data 提供的序列化程序的职责之一。我猜您正在使用 RestSerializer,它通常与 RestAdapter 一起使用,对吗?在那种情况下,您应该自定义 serializeIntoHash() method。完全不使用名称空间应该通过以下方式完成:

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));
  },
});

如果您不支持 IE 11,则无需为 assign 使用 polyfill。在这种情况下,它将是:

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

原生 class 看起来像:

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