找到了一个解决办法(虽然还听取其他建议)。
首先,您可以使用配置对象调用store的load()函数,该配置对象将传递给操作。 Ext.data.Operation的API文档清楚地说明了其中一个配置选项是用于筛选对象数组的,因此可以这样做:
var idFilter = Ext.create('Ext.util.Filter', {
property: 'id',
value: '100,200,300'
});
myStore.load({
filters: [ idFilter ]
});
这将导致一个请求,其中URL查询字符串包含
?filter=[{"property"%3Aid%2C"value"%3A100,200,300}]
(换句话说,是
[{ property: 'id', value: '100,200,300'}]
的URL编码版本)。
您还可以直接调用
myStore.filter('id', '100,200,300')
,而无需先调用
.load()
。假设您的存储中有remoteFilter=true,则这将使用与上述相同的查询参数进行请求。
附注:您可以通过为代理配置“filterParam”配置选项来更改“filter”所使用的关键字。例如,如果filterParam=q,则上面显示的查询字符串将更改为:
?q=[{"property"%3Aid%2C"value"%3A100,200,300}]
第二,您可以控制查询字符串中过滤器的“结构”。在我的情况下,我不想要像上面显示的那样的filter={JSON}。我想要一个看起来像这样的查询字符串:
?id=100,200,300
。为此,我需要扩展代理并覆盖默认的getParams()函数:
Ext.define('myapp.MyRestProxy', {
extend: 'Ext.data.proxy.Rest',
getParams: function(operation) {
var paramsArr = this.callParent(arguments),
paramName,
length;
if( operation.filters ) {
delete paramsArr[this.filterParam];
for (var i = 0; i < operation.filters.length; i++) {
queryParamName = operation.filters[i].property;
if( paramsArr[ queryParamName ] ) {
throw new Error('The operation already has a parameter named "'+paramName+'"');
}
paramsArr[ queryParamName ] = operation.filters[i].value;
}
}
return paramsArr;
}
});