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?
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.
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.
getUnfiltered
-MethodeEine 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.
(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;
(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
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.
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.
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();
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.