2012-06-12 4 views
8

Moje pytanie brzmi: jak uzyskać metadane poza totalRecords, w moim przypadku jest to wersja, kod, wyszukiwanie (proszę spojrzeć na json).Jak skonfigurować ExtJS 4 Store (proxy i czytnik) do odczytu metadanych

{ 
"result": { 
    "version":"1", 
    "code":"200", 
    "searchquery": "false", 
    "totalRecords": "2", 
    "account":[ 
      { 
       "lastname": "Ivanoff", 
       "firstname": "Ivan", 
       "accountId":"1" 
      }, 
      { 
       "lastname": "Smirnoff", 
       "firstname": "Ivan", 
       "accountId":"2" 
      } 
     ] 
} 

}

Oto mój model:

Ext.define("test.Account", { 
    extend: "Ext.data.Model", 
    fields: [ 
     {name: 'accountId', type: 'string'}, 
     {name: 'lastname', type: 'string'}, 
     {name: 'firstname', type: 'string'}  
    ] 
}); 

i przechowywać:

Ext.define("test.TestStore", { 
    extend: "Ext.data.Store", 
    model: "test.Account", 
    proxy: { 
     type: "ajax", 
     url: "users.json", 
     reader: { 
      type : 'json', 
      root : 'result.account', 
      totalProperty: "result.totalRecords" 
     } 
    }, 

    listeners: { 
     load: function(store, records, success) { 
      console.log("Load: success " + success);  
     } 
    } 
}); 

Stosując ten sklep Jestem w stanie załadować rekordy (rachunku), a nie może znaleźć żadnego metody dostępu do pozostałych pól.

Z góry dziękuję.

Odpowiedz

1

Spójrz na klasę Ext.data.Proxy, a dokładniej na metodę processResponse(). Jeśli chcesz wyodrębnić dodatkowe dane - musisz rozszerzyć klasę standardową i zmienić tę metodę.

+0

Sprawdziłem klasę proxy. http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.proxy.Proxy - nie znajduje tam metody "processResponse()". znajduję jeden w Ext.form.action.Action. Czy możesz uczynić tę odpowiedź nieco bardziej zrozumiałą. – Jom

+0

sprawdź 'Ext.data.proxy.Server' w klasie 4.0.7 (myślę, że OP ma ExtJs4 nie 4.1 - ale powinny być stosunkowo podobne) – sha

+0

dziękuję za cynk z metodą processResponse, ale pracuję z wersją 4.1 i zdecydowałem nie dotykać plików ramowych. Jednak znalazłem inne rozwiązanie mojego problemu. Klasa Proxy ma zdarzenie afterRequest, obsługując to zdarzenie mogę uzyskać dane odpowiedzi ze wszystkich pól metadanych. – barmaleikin

17

Oto rozwiązanie mojego problemu. Obsługuję zdarzenie afterRequest w klasie Proxy, gdzie mogę uzyskać dane odpowiedzi, przeanalizować je i zapisać metadane. Jest to część proxy klasy TestStore:

Więc tutaj jest częścią proxy z klasy TestStore:

proxy: { 
     type: "ajax", 
     url: "/users.json", 
     reader: { 
      type : 'json', 
      root : 'gip.account', 
      totalProperty: "gip.totalRecords", 
      searchquery: "searchquery" 
     }, 
     afterRequest: function(req, res) { 
      console.log("Ahoy!", req.operation.response);  
     } 
    } 
+0

możesz oznaczyć to jako odpowiedź! – Jom

+0

Tak, to jest właściwy sposób, aby to zrobić. – Reimius

3

Możliwe jest użycie „metachange” zdarzenie sklepu.

Wszystkie non-ExtJS specyficzne informacje mogą być grupowane w JSON w odrębny przedmiot:

{ 
    "result": { 
     "totalRecords": "2", 
     "account":[ 
      { 
       "lastname": "Ivanoff", 
       "firstname": "Ivan", 
       "accountId":"1" 
      }, 
      { 
       "lastname": "Smirnoff", 
       "firstname": "Ivan", 
       "accountId":"2" 
      } 
     ] 
    }, 
    "myMetaData": { 
     "version":"1", 
     "code":"200", 
     "searchquery": "false" 
    } 
} 

Sklep jest skonfigurowany jako

Ext.define("test.TestStore", { 
    extend: "Ext.data.Store", 
    model: "test.Account", 
    proxy: { 
     type: "ajax", 
     url: "users.json", 
     reader: { 
      type : 'json', 
      root : 'result.account', 
      totalProperty: "result.totalRecords", 
      metaProperty: 'myMetaData' 
     } 
    }, 

    listeners: { 
     metachange: function(store, meta) { 
      console.log("Version " + meta.version + "Search query " + meta.searchQuery);  
     } 
    } 
}); 
Powiązane problemy