2011-12-21 3 views
6

Na przykład, mam interfejs API serwera do ładowania osób, które obsługują żądania takie jak to: GET/people /? Id = 101,329,27ExtJS 4: Jak skonfigurować magazyn, aby ładował modele dla określonego zestawu identyfikatorów?

Chciałbym zbudować sklep (prawdopodobnie niestandardową klasę, która rozszerza Ext .data.Store), który - zakładając, że ma listę identyfikatorów osób - powoduje, że proxy wysyła żądanie podobne do pokazanego powyżej, tak że zwrócone dane są tylko dla tego podzbioru osób.

Zobaczyłem dokumentację dotyczącą zdalnego filtrowania, ale moim zmartwieniem jest, aby go użyć Najpierw musiałbym wywołać store.load(), który ładowałby wszystkie osoby osób, a następnie wywoływał filtr() w celu zdalnego filtrowania. Chciałbym załadować podzbiór osób za pierwszym razem.

Dzięki za porady!

Odpowiedz

5

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; 
    } 
}); 
1

Można również uzyskać Object Model załadować rejestr sobie. Z kontrolera można:

this.getRequestModel().load(requestID,{  //load from server (async) 
     success: function(record, operation) { 
     ..... 
     } 
} 

gdzie Żądanie jest klasą modelu i requestID to identyfikator do wyszukania. W tym scenariuszu obiekt modelu musi również zdefiniować proxy:

proxy: { 
     type: 'ajax', 
     reader: { 
      type:'json', 
      root: 'data' 
     }, 
     api: { 
      create : 'request/create.json', //does not persist 
      read : 'request/show.json' 
     } 
    } 
Powiązane problemy