1

发送 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-server。我需要重写或自定义 ember.js 的序列化,但我不知道如何。

4

1 回答 1

2

这是 Ember Data 提供的 Serializer 的职责之一。我猜您正在使用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,则不需要使用 polyfill 。在这种情况下,它将是:

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));
  }
}
于 2019-10-15T09:06:44.857 回答