我需要在ember.js Adapter中自定义序列化程序

uurity8g  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(157)

我的服务器在发送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的序列化,但我不知道如何操作。

nvbavucw

nvbavucw1#

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

使用原生类别时,它看起来像:

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

相关问题