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

时间:2015-04-07 19:58:29

标签: ember.js ember-data query-parameters

让我们说我有一个Ember.Data查询我想:

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

默认情况下,Ember.Data会创建一个如下所示的网址:

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

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

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

我如何实现这种适应?

3 个答案:

答案 0 :(得分:2)

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

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 Adapter实现:https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js

答案 1 :(得分:0)

根据我在ember数据代码中看到的内容,您必须覆盖RestAdapter的{​​{1}}或findQuery方法,请参阅{{3 (见http://emberjs.com/api/data/classes/DS.RESTAdapter.html#method_findMany)。两者都是私有的,但商店希望findQuery在那里(https://github.com/emberjs/data/blob/v1.0.0-beta.16.1/packages/ember-data/lib/adapters/rest-adapter.js),所以我不希望这种行为很快改变。

如果你将它用于制作,你最好打开一个bug报告,让这个或类似的东西暴露为公共钩子,因为我看不到到目前为止有人在那里。

答案 2 :(得分:0)

@ Kingpin2k的答案是正确的方向,但解决方案更简单。要创建查询参数,Ember Data只需将yields包含在选项对象中的数据对象jQuery.ajax发送到$.param函数。

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

jQuery.Ajax函数还具有traditional标志,以使用传统的param序列化方式。结合这些事实,你只需要自己设置这个标志:

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

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

*如果您需要其他序列化,则需要覆盖$ .param。