web-dev-qa-db-fra.com

Comment récupérer un tableau de données JSON à partir du magasin ExtJS

Existe-t-il une méthode me permettant de renvoyer mes données stockées dans un panneau de grille ExtJS exactement comme je les ai chargées en utilisant:

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

Je souhaite disposer d'une option utilisateur pour recharger la grille, mais les modifications apportées au magasin doivent être prises en compte. L'utilisateur peut apporter des modifications et la grille est mise à jour de manière dynamique, mais si je recharge la grille, les données chargées à l'origine sont affichées même si la base de données a été mise à jour avec les nouvelles modifications. Je préférerais ne pas recharger la page et les laisser simplement recharger les données de grille elles-mêmes avec le magasin nouvellement modifié.

Je suppose que je cherche quelque chose comme ça:

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

après tout dit et fait. Ou existe-t-il un moyen différent d'actualiser la grille avec de nouvelles données que je ne connais pas? Même en utilisant le proxy utilise toujours les données "originales", pas le nouveau magasin.

38
sctskw

Store.getRange() semble être exactement ce que vous recherchez. Il vous retournera Ext.data.Record[] - tableau d'enregistrements. Si aucun argument n'est passé, tous les enregistrements sont retournés.

51
Li0liQ

Une approche à une ligne:

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

Pas très joli, mais assez court.

49
gambetti
 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;
    }
9
Jakofff

Essaye ça:

myStore.each( function (model) {
    console.log( model.get('name') ); 
}); 
4
Yasser Farghaly

Vous n'avez pas besoin de faire de boucles et de collecter/retraiter des données. L'objet JSON dont vous avez besoin est ici:

var jsonData = store.proxy.reader.jsonData;
3
PatlaDJ

Un moyen simple de le faire est

var jsonArray = store.data.items

Donc, si votre magasin JSON est

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

Ensuite, vous pouvez retrouver "DEF" comme

jsonArray[1].data.text

Dans le code suivant, j'ai remarqué qu'il convertissait chaque caractère en un élément de tableau.

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

Voici un autre moyen simple et propre:

var jsonArr = [];
grid.getStore().each( function (model) {
    jsonArr.Push(model.data);
});
2
Rocco

J'utilise toujours store.proxy.reader.jsonData ou store.proxy.reader.rawData

Par exemple, ceci renvoie les éléments imbriqués dans un nœud racine appelé "data":

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

Cela ne fonctionne que immédiatement après une opération de lecture dans le magasin (même s’il n’a pas encore été manipulé).

0
Martin Zeitler

Si vous voulez obtenir les données exactement comme ce que vous obtenez avec Writer (par exemple, en ignorant les champs avec persist:false config), utilisez le code suivant (Remarque: je l’ai testé dans Ext 5.1)

  var arr = [];   

    this.store.each(function (record) {
        arr.Push(this.store.getProxy().getWriter().getRecordData(record))
    });  
0
Mahmoud Moravej
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'
        }
    }

Utilisez allowSingle, il convertira en tableau

0
Medini Patki

Une meilleure approche à une ligne (IMO), fonctionne sur ExtJS 4, pas sûr de 3:

store.proxy.reader.jsonData
0
George Jempty

Comme suggéré ci-dessus, j'ai essayé ci-dessous un avec échec.

store.proxy.reader.jsonData

Mais en dessous on travaillait pour moi

store.proxy.reader.rawData
0
Ravi MCA

J'ai eu beaucoup de difficultés à essayer d'accéder aux données du magasin sans les associer à un composant, principalement parce que le magasin était chargé via ajax. Il a donc fallu utiliser l'événement load pour lire les données. Cela a fonctionné:

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

Dans mon cas, je voulais un tableau javascript déchiqueté, par exemple. [["row1Cell1", "row1cell2"], ["row2Cell1", "row2cell2"]] en fonction du contenu du magasin de grilles Ext.

Le javascript comme ci-dessous va créer un tel tableau, en laissant tomber la clé id dans l'objet dont je n'avais pas besoin.

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