J'ai une question. Est-il possible d'obtenir tous les enregistrements chargés dans un magasin lorsque les filtres sont ajoutés au magasin? Par exemple, si je charge dans le magasin 34 enregistrements, puis applique des filtres et qu'il ne reste que 15 d'entre eux, pourrais-je obtenir ces 34 enregistrements sans effacer les filtres?
Edit: Cela avait été initialement répondu pour Ext 4.2, où snapshot
était public et documenté. Il est parti aujourd'hui. Alors, voici une mise à jour pour Ext 5 et 6.
Bon mot:
var allRecords = (store.getData().getSource() || store.getData()).getRange();
Décomposition:
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
vous donne la collection du magasin.
Collection#getSource
vous donne la "source" du magasin, c'est-à-dire la collection non filtrée - mais uniquement si la collection a déjà été filtrée, sinon elle retourne null
.
Dans les deux cas, vous obtiendrez un Ext.util.Collection
. Utilisez getRange
pour obtenir un tableau réel d’éléments.
getUnfiltered
Une méthode getUnfiltered
a été introduite à un moment donné dans Ext 5 (5.0.1 pour autant que je sache, mais les documents pour Ext 5 sont hors ligne pour le moment ...). Il n'était pas présent dans les premières versions de Ext 5, et il était terminé par Ext 6. Alors, eh bien ... Ne l'utilisez pas! Sauf si vous souhaitez lier votre code à Ext 5 sans raison, utilisez la méthode ci-dessus.
_ {(réponse originale)} _
L'ensemble de données chargé est stocké dans la propriété snapshot
du magasin.
Il est créé uniquement lorsque cela est nécessaire. Cela signifie que la propriété ne sera pas disponible avant que certains filtres aient été appliqués au magasin. Donc, pour obtenir les informations souhaitées de manière sécurisée, utilisez:
var allRecords = store.snapshot || store.data;
(et probablement les futures versions)
Vous pouvez utiliser query
ou queryBy
.
Cela semble être l'approche la plus compatible puisque, contrairement aux méthodes précédentes, cette API n'a pas changé d'une version à l'autre.
Malheureusement, cela traversera la collection et entraînera des coûts de traitement supplémentaires ... Ce qui peut être négligeable ou non en fonction de la taille de votre collection.
var allRecords = store
.queryBy(function() { return true; }) // returns a collection
.getRange(); // returns array of items
Peut-être une approche plus compatible avec les versions antérieures (à savoir, version ExtJS> = 5) est la suivante:
var allRecords = store.getData().getSource().getRange();
Selon la documentation, cela devrait fonctionner pour les versions> = 5.0.
Pour obtenir toutes les données non filtrées d'un magasin chargé, vous pouvez essayer Var records = store.getUnfiltered ();
Note: J'utilise Ext Js 5.1. Pas sûr des versions précédentes.
Si vous voulez obtenir des enregistrements bruts à partir de la réponse http uniquement, voici ma solution:
Ajoutez la fonction getRawRecords
à la classe store
:
Ext.override(Ext.data.Store, {
getRawRecords: function(){
return Ext.Array.map(this.getData().getRange(), function(record){
return record.data;
});
}
});
Usage:
var rawData = store.getRawRecords();
Pour mon cas avec ExtJS 4.2.1 (oui, je sais que c'est vieux) avec un arbre JSON, je devais utiliser: store.proxy.reader.jsonData
car store.snapshot
, store.data
, store.query
ou store.queryBy
n'existait pas.