2010-03-26 7 views
37

Gibt es eine Methode erlaubt mir meine gespeicherten Daten in einer ExtJS Grid-Panel abrufen zurückzukehren genau so, wie ich es mit geladen:Wie JSON Daten Array von ExtJS Shop

var data = ["value1", "value2"] 
Store.loadData(data); 

Ich möchte einen Benutzer haben Option, um das Grid neu zu laden, aber Änderungen am Speicher müssen berücksichtigt werden. Der Benutzer kann Änderungen vornehmen, und das Raster wird dynamisch aktualisiert. Wenn ich das Raster jedoch neu lade, werden die ursprünglich geladenen Daten angezeigt, obwohl die Datenbank mit den neuen Änderungen aktualisiert wurde. Ich würde es vorziehen, die Seite nicht neu zu laden und sie nur die Grid-Daten mit dem neu geänderten Speicher neu laden zu lassen.

Ich glaube, ich bin für so etwas suchen:

var data = Store.getData(); 
//data = ["value1", "value2"] 

nach dem alles gesagt und getan. Oder gibt es eine andere Möglichkeit, das Raster mit neuen Daten zu aktualisieren, die mir nicht bekannt sind. Selbst wenn der Proxy verwendet wird, werden immer noch die "ursprünglichen" Daten verwendet, nicht der neue Speicher.

+0

alle diese Lösungen haben ein grundsätzliches Problem in EXTjs5 http://www.sencha.com/forum/showthread.php?290444-store.getData%28%29-returns-quot-id-quot- elment-in-model-data-bug & p = 1061271 weiß immer noch nicht, ob es Bug oder Feature ist – mcmatak

Antwort

51

Store.getRange() scheint genau das zu sein, was Sie suchen. Es wird Ihnen Ext.data.Record[] - Array von Datensätzen zurückgeben. Wenn keine Argumente übergeben werden, werden alle Datensätze zurückgegeben.

+7

Ich war auf der Suche nach Store.getRange(). json – sctskw

+4

@ user291928: Ehrlich gesagt, haben Sie nicht das Format angegeben, in dem Sie die Daten benötigt und diese Antwort scheint geholfen zu haben. Ich schlage vor, Sie wählen eine Antwort aus. – Keylan

+1

Name der beschissenen Methode. Danke für das Aufzeigen! – phatmann

9
function getJsonOfStore(store){ 
     var datar = new Array(); 
     var jsonDataEncode = ""; 
     var records = store.getRange(); 
     for (var i = 0; i < records.length; i++) { 
      datar.push(records[i].data); 
     } 
     jsonDataEncode = Ext.util.JSON.encode(datar); 

     return jsonDataEncode; 
    } 
46

Ein einzeiliger Ansatz:

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data'));

Nicht sehr hübsch, aber recht kurz.

+0

dies ist für Ext 4.0> – jellyfishtree

+0

es funktioniert für 3.3.1 auch - ist in der Dokumentation - ich seit ich diesen Beitrag fand Ich benutze es mit vollem Erfolg und halte es für schön – bensiu

+0

Diese Methode wurde seit 4.0.0 DEAKTIVIERT –

4

Try this:

myStore.each(function (model) { 
    console.log(model.get('name')); 
}); 
1

Ein besseren (IMO) einzeiliger Ansatz funktioniert auf ExtJS 4, nicht sicher 3:

store.proxy.reader.jsonData 
+0

Nun Mist der docs sagen, das oben genannte ist veraltet, obwohl rawData stattdessen (direkt unter jsonData aufgelistet) funktionieren könnte, aber ich habe es nicht http://docs.sencha.com/ext-js/4-0/#!/api/Ext getestet .data.reader.Json-property-jsonData –

0

Ich laufe in meinen Anteil an Schwierigkeiten versuchen, Greifen Sie auf Daten aus dem Geschäft zu, ohne sie an eine Komponente zu binden. Der Hauptgrund dafür war, dass der Speicher über AJAX geladen wurde. Daher musste das Load-Ereignis verwendet werden, um die Daten zu lesen. Das funktionierte:

store.load(); 
store.on('load', function(store, records) { 
    for (var i = 0; i < records.length; i++) { 
    console.log(records[i].get('name')); 
    }; 
}); 
1

Ein einfacher Weg, diese

var jsonArray = store.data.items 

Also, wenn Ihr JSON Speicher

ist
[{"text": "ABC"}, {"text": "DEF"},{"text": "GHI"},{"text": "JKL"}] 

zu tun ist, dann können Sie "DEF" als

jsonArray[1].data.text 
retreive

Im folgenden Code habe ich festgestellt, dass es konvertiert jedes einzelne Zeichen in ein Array-Element.

var jsonData = Ext.encode(Ext.pluck(store.data.items, 'data')); 
1

Ich benutze immer store.proxy.reader.jsonData oder store.proxy.reader.rawData

Zum Beispiel - das die Elemente zurückkehren in einen Wurzelknoten ‚Daten‘ genannt verschachtelt:

var some_store = Ext.data.StoreManager.lookup('some_store_id'); 
Ext.each(some_store.proxy.reader.rawData.data, function(obj, i){ 
    console.info(obj); 
}); 

Dies funktioniert nur unmittelbar nach einem Geschäft Read- Operation (noch nicht manipuliert).

+0

Ein bisschen Beispielcode oder ein Link zu einem Beispiel wäre noch besser! –

2

Hier ist eine weitere einfache saubere Art und Weise:

var jsonArr = []; 
grid.getStore().each(function (model) { 
    jsonArr.push(model.data); 
}); 
3

Sie brauchen keine Schleifen zu machen und sammeln/Daten erneut verarbeiten. Das json Objekt, das Sie benötigen, ist hier:

var jsonData = store.proxy.reader.jsonData; 
+1

Dadurch werden die ursprünglichen Geschäftsdaten abgerufen, nicht die aktualisierten Geschäftsdaten, die seither geändert werden konnten – xblitz

0
proxy: { 
     type: 'ajax', 
     actionMethods: { 
      read: 'POST', 
      update: 'POST' 
     }, 
     api: { 
      read: '/bcm/rest/gcl/fetch', 
      update: '/bcm/rest/gcl/save' 
     }, 
     paramsAsJson: true, 
     reader: { 
      rootProperty: 'data', 
      type: 'json' 
     }, 
     writer: { 
      allowSingle: false, 
      writeAllFields: true, 
      type: 'json' 
     } 
    } 

Verwenden allowSingle es

0

in ein Array umwandeln Wenn Sie die Daten genau wie zu bekommen, was Sie mit persist:false von Writer (zum Beispiel ignoriert Felder erhalten config), benutze den folgenden Code (Hinweis: Ich habe es in Ext 5.1 getestet)

var arr = []; 

    this.store.each(function (record) { 
     arr.push(this.store.getProxy().getWriter().getRecordData(record)) 
    }); 
0

Wie oben vorgeschlagen, habe ich versucht, eine mit Fehler.

store.proxy.reader.jsonData 

Aber unter ein für mich gearbeitet

store.proxy.reader.rawData 
0

In meinem Fall habe ich eine Javascript-gezackten Array wollte z.B. [["row1Cell1", "row1cell2"], ["row2Cell1", "row2cell2"]] basierend auf dem Inhalt des Ext-Grid-Speichers.

Das Javascript wie unten wird so ein Array erstellen, den ID-Schlüssel in das Objekt fallen lassen, die ich nicht brauchte.

var tableDataArray = []; 
Ext.ComponentQuery.query('[name="table1"]')[0].store.each(function(record){ 
    var thisRecordArray = []; 
    for (var key in record.data) { 
     if (key != 'id') { 
      thisRecordArray.push(record.data[key]); 
     } 
    } 
    tableDataArray.push(thisRecordArray); 
});