web-dev-qa-db-de.com

Extjs erhalten alle Geschäftsdatensätze

Ich habe eine Frage. Ist es möglich, alle Datensätze abzurufen, die in einem Speicher geladen werden, wenn die Filter zum Speichern hinzugefügt werden? Wenn ich zum Beispiel 34 Datensätze in den Store lade und dann Filter verwende und nur noch 15 vorhanden sind, könnte ich dann diese 34 Datensätze erhalten, ohne Filter zu löschen?

14
kuldarim

Bearbeiten: Dies wurde ursprünglich für Ext 4.2 beantwortet, wobei snapshot öffentlich und dokumentiert war. Es ist heute weg. Hier also ein Update für Ext 5 und 6.

Ext 5/6

Einzeiler:

var allRecords = (store.getData().getSource() || store.getData()).getRange();

Zersetzung:

var data = store.getData();
// get unfiltered collection (will be null if the store has never been filtered)
var snapshot = data.getSource();
// pick the one that exists
var unfilteredCollection = snapshot || data;
// get items in an array
var allRecords = unfilteredCollection.getRange();

Store#getData gibt die Sammlung des Shops an.

Collection#getSource gibt Ihnen die "Quelle" des Geschäfts, dh die ungefilterte Sammlung - jedoch nur, wenn die Sammlung bereits gefiltert wurde, andernfalls wird null zurückgegeben.

In beiden Fällen erhalten Sie einen Ext.util.Collection. Verwenden Sie getRange , um ein aktuelles Array von Elementen zu erhalten.

Ext 5 getUnfiltered-Methode

Eine getUnfiltered-Methode wurde irgendwann in Ext 5 eingeführt (5.0.1, soweit ich das beurteilen kann, aber die Dokumente für Ext 5 sind im Moment offline ...). In den ersten Versionen von Ext 5 war es nicht vorhanden, und Ext 6 war nicht mehr vorhanden. Also, verwenden Sie es nicht! Wenn Sie Ihren Code nicht ohne Grund an Ext 5 binden möchten, verwenden Sie die obige Methode.

Ext 4

(ursprüngliche Antwort)

Die gesamte geladene Datenmenge wird in der Eigenschaft snapshot des Geschäfts gespeichert. 

Es wird jedoch nur bei Bedarf erstellt. Das bedeutet, dass die Eigenschaft erst verfügbar ist, nachdem einige Filter auf den Store angewendet wurden. Um die gewünschten Informationen auf sichere Weise zu erhalten, verwenden Sie:

var allRecords = store.snapshot || store.data;

Ext 4/5/6

(und wahrscheinlich zukünftige Versionen)

Sie können query oder queryBy verwenden.

Dies scheint der vorwärtskompatibelere Ansatz zu sein, da sich diese API im Gegensatz zu den vorherigen Methoden nicht an Versionen geändert hat. 

Leider durchquert dies die Sammlung und verursacht zusätzliche Bearbeitungskosten ... Die je nach Größe Ihrer Sammlung möglicherweise vernachlässigbar sind.

var allRecords = store
  .queryBy(function() { return true; }) // returns a collection
  .getRange(); // returns array of items
28
rixo

Möglicherweise ist ein nach vorne kompatibler Ansatz (d. H. Die ExtJS-Version> = 5) der folgende:

var allRecords = store.getData().getSource().getRange();

Basierend auf der Dokumentation sollte dies für Versionen> = 5.0 funktionieren.

5
Mike Kelly

Um alle ungefilterten Daten aus einem geladenen Speicher abzurufen, können Sie Var records = store.getUnfiltered ();

Hinweis: Ich verwende Ext Js 5.1. Nicht sicher über frühere Versionen.

4
Sikandar

Wenn Sie Rohdaten nur von http-Antwort erhalten möchten, finden Sie hier meine Lösung:

Fügen Sie die getRawRecords-Funktion zur store-Klasse hinzu:

    Ext.override(Ext.data.Store, {
        getRawRecords: function(){
            return Ext.Array.map(this.getData().getRange(), function(record){
                return record.data;
            });
        }
    });

Verwendungszweck:

    var rawData = store.getRawRecords();
1
Damiano

Für meinen Fall mit ExtJS 4.2.1 (ja, ich weiß, dass es alt ist) mit einem JSON TreeStore musste ich Folgendes verwenden: store.proxy.reader.jsonData, da store.snapshot, store.data, store.query oder store.queryBy nicht vorhanden waren.

0
Emmanuel