格式化 Ember.Data 中的数组查询参数

Formatting query parameters that are arrays in Ember.Data

假设我有一个 Ember.Data 查询要进行:

this.store.find('items', {itemIds: [1,2,3]});

默认情况下,Ember.Data 创建如下所示的 URL:

items?itemIds%5B%5D=1&itemIds%5B%5D=2&itemIds%5B%5D=3

但是我要连接的 REST api 需要这种格式:

items?itemIds=1&itemIds=2&itemIds=3

如何实现这种适应?

扩展 RESTAdapter 并覆盖 ajax 方法,并根据情况创建您要使用的 URL。

App.ItemsAdapter = DS.RESTAdapter.extend({
  ajax: function(url, type, options){
    if(myCircumstance){
      var data = options.data;
      delete options.data;
      url = url + ......;
    }
    return this._super(url, type, options);
  }
});

REST 适配器实现:https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js

根据我在 ember 数据代码中看到的内容,您必须覆盖 RestAdapterfindQueryajax 方法,请参阅 http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_findMany (see https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js). Both are private, but the store expects the findQuery to be there (https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/system/store/finders.js#L137), 所以我不希望这种行为很快改变。

如果你将它用于生产,你最好打开一个错误报告,将这个或类似的东西暴露为 public 钩子,因为到目前为止我还没有看到它。

@Kingpin2k的回答方向是对的,但是解决方法更简单。要创建查询参数,Ember 数据只需 yields the data object, wrapped in the options object, to the jQuery.ajax 函数。

知道了,我们只需要另一个查询参数序列化器。默认情况下,jQuery 将按照 TS 描述的方式序列化数组。您可以通过覆盖 $.param 方法来更改序列化方式。但幸运的是我们甚至没有,因为 $.param 函数有第二个参数,称为 traditional 序列化。如果设置为true,序列化会像TS wanted*.

jQuery.Ajax函数也有traditional标志来使用传统风格的参数序列化。结合这些事实,你只需要自己设置这个标志:

DS.RESTAdapter.extend({
  ajax(url, type, options) {
    if (options) {
      options.traditional = true;
    }
    return this._super(...arguments);
  }
});

P.S。如果您使用 JSONAPIAdapter,技巧是相同的,因为 JSONAPIAdapter 扩展了 RESTAdapter。

*如果你需要另一个序列化,你需要覆盖 $.param.