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.
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.
Une approche à une ligne:
var jsonData = Ext.encode (Ext.pluck (store.data.items, 'data'));
Pas très joli, mais assez court.
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;
}
Essaye ça:
myStore.each( function (model) {
console.log( model.get('name') );
});
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;
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'));
Voici un autre moyen simple et propre:
var jsonArr = [];
grid.getStore().each( function (model) {
jsonArr.Push(model.data);
});
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é).
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))
});
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
Une meilleure approche à une ligne (IMO), fonctionne sur ExtJS 4, pas sûr de 3:
store.proxy.reader.jsonData
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
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'));
};
});
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);
});