Znaleziono rozwiązanie (choć wciąż otwarte na słuchanie innych pomysłów).
Najpierw można wywołać funkcję load() sklepu z obiektem config, który zostanie przekazany do operacji. Docs API dla Ext.data.Operation jasno wynika, że jedną z opcji konfiguracyjnych jest tablicą obiektów Filter, więc można to zrobić:
var idFilter = Ext.create('Ext.util.Filter', {
property: 'id',
value: '100,200,300'
});
myStore.load({
filters: [ idFilter ]
});
Prowadzi to do wniosku, gdzie querystring URL zawiera ?filter=[{"property"%3Aid%2C"value"%3A100,200,300}]
(innymi słowy, zakodowana w postaci adresu URL wersja [{ property: 'id', value: '100,200,300'}]
).
Można również po prostu zadzwonić pod numer myStore.filter('id', '100,200,300')
, nie dzwoniąc pod numer .load()
. Zakładając, że w twoim sklepie znajduje się remoteFilter = true, spowoduje to wysłanie żądania z tymi samymi parametrami zapytania.
Sidenote: możesz zmienić słowo kluczowe użyte do "filtra", konfigurując opcję konfiguracji "filterParam" dla serwera proxy. Na przykład, jeśli filterParam = q, wówczas querystring pokazano powyżej zmian: ?q=[{"property"%3Aid%2C"value"%3A100,200,300}]
II, można kontrolować „strukturę” filtra w ciągu kwerendy. W moim przypadku nie chciałem czegoś takiego jak filter = {JSON}, jak pokazano powyżej. Chciałem ciągu kwerendy, która wyglądała tak: ?id=100,200,300
Do tego musiałem przedłużyć pełnomocnictwa i zastąpić domyślny getParams() Funkcja:
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;
}
});