Ember - 多个模型的自定义适配器和序列化器

Ember - Custom adapter and serializer for multiple models

我正在使用 RESTAdapter 和 RESTSerializer 在我的 ember 项目中集成休息服务。我能够使用默认的 ApplicationAdapter(扩展 RESTAdapter)执行其余服务操作,并且能够为特定模型创建自定义适配器。

我想创建一个可用于某些特定模型集的自定义适配器。

例子,

//Application adapter extends RESTAdapter

var LookupAdapter = ApplicationAdapter.extend({
   host: Properties.LookupServiceHost,
   namespace : Properties.LookupServiceNamespace,
});

export default LookupAdapter;

我有一些模型,如国家、语言等。为了在数据存储中获取和填充数据,现在我使用单独的适配器、序列化程序(用于处理请求、响应)每个模型。我希望这些特定模型与 LookupAdapter 一起使用。我们能否将此适配器分配给模型,以便这些模型将使用 LookupAdapter/LookupSerializer?

有没有办法告诉模型你的 Adapter 是 LookupAdapter?

您可以为每个模型创建适配器和序列化器并导入您的 LookupAdapter / -Serializer 并从中扩展。前方未经测试的代码:

// In file ../adapters/country.js
import LookupAdapter from '../adapters/lookup';
export default LookupAdapter.extend({});

我想你甚至可以省略 .extend({})

编辑:

如果您不想为每个模型创建适配器和序列化程序,您可以实现自己的 DS.StoreDS.Store 提供了这些方法:

  • 适配器
  • serializerFor

您可以编写映射 table,将 modelName 映射到您指定的适配器。

此外,ember.js 源代码指出,当找不到适配器时,将使用 ApplicationAdapter

编辑 2:

你可以这样做:

app/mappings/adapters.js:

export default {
  'country': 'lookup',
  'city': 'lookup'
}

app/stores/application.js:

import adaptersMapping from '../mappings/adapters';

export default DS.Store.extend({
  adapterFor(modelName) {
    if(adaptersMapping[modelName]) {
      return this._super(adaptersMapping[modelName]);
    }
    return this._super(modelName);
  }
});