让我们说我有一个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
我如何实现这种适应?
答案 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。