Encontré una solución (aunque todavía estoy abierto para escuchar otras ideas).
Primero, puede llamar a la función load() de una tienda con un objeto config que se pasará a una operación. Los documentos de la API para Ext.data.Operation dejan claro que una de las opciones de configuración es para una gran variedad de objetos de filtro, por lo que pueden hacer esto:
var idFilter = Ext.create('Ext.util.Filter', {
property: 'id',
value: '100,200,300'
});
myStore.load({
filters: [ idFilter ]
});
Esto se traduce en una solicitud en la cadena de consulta URL contiene ?filter=[{"property"%3Aid%2C"value"%3A100,200,300}]
(en otras palabras, una versión con codificación URL de [{ property: 'id', value: '100,200,300'}]
).
También puede simplemente llamar al myStore.filter('id', '100,200,300')
sin haber llamado primero a .load()
. Suponiendo que tiene remoteFilter = true en su tienda, esto hará una solicitud con los mismos params de consulta mostrados anteriormente.
Sidenote: puede cambiar la palabra clave utilizada para 'filtro' mediante la configuración de la opción de configuración 'filterParam' para el proxy. Por ejemplo, si filterParam = q, entonces la cadena de consulta se muestra arriba cambia a: ?q=[{"property"%3Aid%2C"value"%3A100,200,300}]
Segunda, puede controlar "estructura" del filtro en la cadena de consulta. En mi caso, no quería algo como filter = {JSON}, como se muestra arriba. Yo quería una cadena de consulta que se parecía a esto: la función ?id=100,200,300
Para ello necesitaba para extender un proxy y anular los getParams por defecto():
Ext.define('myapp.MyRestProxy', {
extend: 'Ext.data.proxy.Rest',
/**
* Override the default getParams() function inherited from Ext.data.proxy.Server.
*
* Note that the object returned by this function will eventually be used by
* Ext.data.Connection.setOptions() to include these parameters via URL
* querystring (if the request is GET) or via HTTP POST body. In either case,
* the object will be converted into one, big, URL-encoded querystring in
* Ext.data.Connection.setOptions() by a call to Ext.Object.toQueryString.
*
* @param {Ext.data.Operation} operation
* @return {Object}
* where keys are request parameter names mapped to values
*/
getParams: function(operation) {
// First call our parent's getParams() function to get a default array
// of parameters (for more info see http://bit.ly/vq4OOl).
var paramsArr = this.callParent(arguments),
paramName,
length;
// If the operation has filters, we'll customize the params array before
// returning it.
if(operation.filters) {
// Delete whatever filter param the parent getParams() function made
// so that it won't show up in the request querystring.
delete paramsArr[this.filterParam];
// Iterate over array of Ext.util.Filter instances and add each
// filter name/value pair to the array of request params.
for (var i = 0; i < operation.filters.length; i++) {
queryParamName = operation.filters[i].property;
// If one of the query parameter names (from the filter) conflicts
// with an existing parameter name set by the default getParams()
// function, throw an error; this is unacceptable and could cause
// problems that would be hard to debug, otherwise.
if(paramsArr[ queryParamName ]) {
throw new Error('The operation already has a parameter named "'+paramName+'"');
}
paramsArr[ queryParamName ] = operation.filters[i].value;
}
}
return paramsArr;
}
});