2012-06-12 4 views
8

Meine Frage ist, wie Metadaten neben TotalRecords zu bekommen, in meinem Fall ist es Version, Code, searchquery (siehe json).So konfigurieren Sie ExtJS 4 Store (Proxy und Reader) zum Lesen von Metadaten

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

}

Hier ist mein Modell:

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

und zu speichern:

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

diesen Speicher verwenden Ich bin in der Lage Datensätze zu laden (Konto) und kann keine finden Methoden, um auf die restlichen Felder zuzugreifen.

Vielen Dank im Voraus.

Antwort

1

Schauen Sie sich Ext.data.Proxy Klasse und genauer processResponse() Methode. Wenn Sie zusätzliche Daten extrahieren müssen, müssen Sie die Standardklasse erweitern und diese Methode ändern.

+0

i-Proxy konfiguriert Klasse geprüft. http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.proxy.Proxy - dort findet sich keine 'processResponse()' Methode. Ich finde einen in Ext.form.action.Action. Können Sie diese Antwort etwas klarer machen? – Jom

+0

überprüfen Sie 'Ext.data.proxy.Server' Klasse in 4.0.7 (Ich denke, OP hat ExtJs4 nicht 4.1 - aber sie sollten relativ ähnlich sein) – sha

+0

Vielen Dank für den Tipp mit ProcessResponse-Methode, aber ich arbeite mit Version 4.1 und entschied Framework-Dateien nicht zu berühren. Allerdings habe ich eine andere Lösung für mein Problem gefunden. Proxy-Klasse hat AfterRequest Event, dieses Ereignis behandeln Ich kann Antwortdaten mit allen Metadaten-Feld erhalten. – barmaleikin

17

Hier ist die Lösung für mein Problem. Ich bearbeite das Ereignis "request" in der Proxy-Klasse, wo ich Antwortdaten abrufen, analysieren und Metadaten speichern kann. Dies ist Proxy-Teil der tests Klasse:

So, hier ist Proxy-Teil aus der Klasse tests:

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

können Sie dies als Antwort markieren! – Jom

+0

Ja, das ist der richtige Weg. – Reimius

3

Es ist möglich, die ‚metachange‘ Ereignis des Ladens zu verwenden.

die Nicht-extjs Alle spezifischen Informationen finden Sie im separaten Objekt in JSON gruppiert werden:

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

Der Laden ist als

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