格式化 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);
}
});
根据我在 ember 数据代码中看到的内容,您必须覆盖 RestAdapter
的 findQuery
或 ajax
方法,请参阅 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.
假设我有一个 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);
}
});
根据我在 ember 数据代码中看到的内容,您必须覆盖 RestAdapter
的 findQuery
或 ajax
方法,请参阅 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.