J'essaie de créer une grille dynamique en utilisant Extjs. La grille est construite et affichée lorsqu'un événement de clic est déclenché, puis une requête ajax est envoyée au serveur pour extraire les colonnes, les enregistrements et la définition des enregistrements a.k.a Store Fields. Chaque nœud peut avoir une structure de grille différente et cela dépend du niveau du nœud dans l'arbre.Extjs Dynamic Grid
La seule façon que je suis venu avec à ce jour est
function showGrid(response, request) {
var jsonData = Ext.util.JSON.decode(response.responseText);
var grid = Ext.getCmp('contentGrid'+request.params.owner);
if(grid) {
grid.destroy();
}
var store = new Ext.data.ArrayStore({
id : 'arrayStore',
fields : jsonData.recordFields,
autoDestroy : true
});
grid = new Ext.grid.GridPanel({
defaults: {sortable:true},
id:'contentGrid'+request.params.owner,
store: store,
columns: jsonData.columns,
//width:540,
//height:200,
loadMask: true
});
store.loadData(jsonData.records);
if(Ext.getCmp('tab-'+request.params.owner)) {
Ext.getCmp('tab-'+request.params.owner).show();
} else {
grid.render('grid-div');
Ext.getCmp('card-tabs-panel').add({
id:'tab-'+request.params.owner,
title: request.params.text,
iconCls:'silk-tab',
html:Ext.getDom('grid-div').innerHTML,
closable:true
}).show();
}
}
La fonction ci-dessus est appelée lorsqu'un événement clique est
'click': function(node) {
Ext.Ajax.request({
url: 'showCtn',
success: function(response, request) {
alert('Success');
showGrid(response,request);
},
failure: function(results, request) {
alert('Error');
},
params: Ext.urlDecode(node.attributes.options);
}
Le problème que je reçois avec ce code est que une nouvelle grille est affichée à chaque fois que la fonction showGrid est appelée. L'utilisateur final voit les anciennes grilles et la nouvelle. Pour atténuer ce problème, j'ai essayé de détruire la grille et de supprimer également l'élément de grille sur chaque requête, ce qui semble résoudre le problème uniquement que les enregistrements ne sont jamais affichés cette fois.
if(grid) {
grid.destroy(true);
}
Le comportement que je cherche est d'afficher le résultat d'une grille dans un onglet et si cet onglet existe remplacé l'ancienne grille. Toute aide est appréciée.
Merci
Great cela fonctionne. Je vous remercie. Quant à détruire et recréer la grille à chaque fois, je ne peux malheureusement pas garantir un nombre limité de grilles, donc je n'ai pas le choix. BTW Pourquoi la destruction de la grille n'est pas considérée comme une bonne stratégie? – ken
Le GridPanel est à peu près le composant le plus lourd en termes de balisage et d'encombrement mémoire (à part peut-être un TreePanel avec beaucoup de nœuds). Si vous ne faites pas attention (ou si Ext a des bugs liés à la destruction des composants comme ils l'ont fait par le passé) cela peut conduire à des fuites DOM au fil du temps. De plus, la création d'une grille prend du temps du point de vue de l'utilisateur, donc recréer une grille plutôt que de la masquer est une grande différence dans les performances perçues de votre application (surtout lorsqu'elle est effectuée comme vous le faites). Content que tu aies résolu ton problème. –
Bon à savoir.Je vais essayer de me concentrer davantage sur ce point une fois que j'aurai une idée claire si je peux contrôler le nombre de grilles demandées. Peut-être avoir un groupe de réseaux pour servir et limiter leur nombre. – ken