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

Ember.js 格式化作为Ember.Data中数组的查询参数,ember.js,ember-data,query-parameters,Ember.js,Ember Data,Query Parameters,假设我有一个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 如何实现这种自适应?扩展RESTA

假设我有一个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适配器实现:

从我在ember数据代码中看到的情况来看,您必须覆盖
RestAdapter
findQuery
ajax
方法,请参阅(请参阅)。两者都是私有的,但是商店希望findQuery在那里(),所以我不希望这种行为很快改变


如果您将其用于生产,最好打开一个bug报告,将其或类似内容作为公共钩子公开,因为到目前为止我还看不到

@Kingpin2k的答案是正确的方向,但解决方案更简单。要创建查询参数,只需将数据对象(包装在options对象中)添加到函数即可

知道了这一点,我们只需要另一个查询参数序列化程序。默认情况下,jQuery将按照TS描述的方式序列化数组。您可以通过重写该方法来更改序列化方式。但幸运的是,我们甚至没有,因为
$.param
函数有第二个参数,称为
传统的
序列化。如果设置为
true
,则序列化将类似于所需的TS*

Ajax函数还具有
traditional
标志,以使用传统风格的参数序列化。结合这些事实,您只需自己设置此标志:

DS.RESTAdapter.extend({
  ajax(url, type, options) {
    if (options) {
      options.traditional = true;
    }
    return this._super(...arguments);
  }
});
另外,如果使用,诀窍是相同的,因为JSONAPIAdapter扩展了RESTAdapter


*如果需要另一个序列化,则需要重写$.param。

是否确定?In-id数组被排除,注释说这是因为它们是作为查询参数传递的。这(以及代码)表明这里并没有真正处理查询参数。没错,它必须跳到ajax级别。