2013-04-15 2 views
2

Ext JS 4.1Comment obtenir des données de TreeStore Extjs4.1

Pour obtenir des données de valeur de 'Ext.data.Store', il suffit d'utiliser

var data1 = store.data.items[0].data.fieldname; 

ou

var data1 = store.getAt(0).data.fieldname; 

mais, dans 'Ext.data.TreeStore', cette méthode ne fonctionne pas!

des suggestions?

Répondre

-1

Il s'agit en fait d'une fonctionnalité indispensable.

Considérons la situation lorsque vous avez une grille arborescente avec une colonne de vérification, vous écoutez un événement "checkchange" de cette colonne et vous voulez trouver un enregistrement qui vient d'être modifié.

Malheureusement, tous les ExtJS vous fournit un index d'enregistrement. Heureusement cependant, personne ne nous empêche de définir notre propre méthode getAt dans notre propre magasin qui fait exactement ce que nous voulons:

{ 
    store: 'tree', 
    getAt: function (index) { 
    var current = 0; 
    return (function find(nodes) { 
     var i, len = nodes.length; 
     for (i = 0; i < len; i++) { 
     if (current === index) { 
      return nodes[i]; 
     } 
     current++; 
     var found = find(nodes[i].childNodes); 
     if (found) { 
      return found; 
     } 
     } 
    }(this.tree.root.childNodes)); 
    } 
} 
+0

Avec ExtJS 4.2.x, l'indice du noeud passé par l'événement checkchange ne compte pas enfants de noeuds effondrés. Donc, avec le code ci-dessus, je vais obtenir le mauvais enregistrement du modèle. J'ai simplement ajouté "if (nodes [i] .isExpanded()) {" ... after "courant ++;" et ça a l'air de bien fonctionner. Bien que cela semble fonctionner, je ne vais probablement pas coller avec ce code car il semble un peu fragile. – nogridbag

8

Ceci est une idée fausse commune avec Extjs. Un Ext.data.TreeStore et Ext.data.Store ne sont pas vraiment similaires et n'héritent pas de l'autre.

Un magasin contient des données sous la forme d'un tableau de modèles:

[ 
    { 
     attribute1, 
     attribute2, 
     ... 
    }, 
    ... 
] 

Alors qu'un treestore contient des données sous la forme d'une structure arborescente des nœuds, comme ceci:

{ 
    attribute1, 
    attribute2, 
    ..., 
    children: [ 
     { 
      attribute1, 
      attribute2, 
      ..., 
      children: [ 
       ... 
      ] 
     } 
    ] 
} 

Due à ces structures complètement différentes sous-jacentes au magasin régulier et au magasin, les fonctions sur eux sont complètement différentes. Je suppose que dans votre exemple ci-dessus, l'utilisation correcte des fonctions de stockage et nœud serait:

var data1 = treestore.getRootNode().getChildAt(0).get(fieldname); 

getRootNode() obtient le nœud racine de votre arbre qui est représenté par la classe NodeInterface qui a la méthode getChildAt(index) qui récupère le premier nœud enfant du nœud racine. Ensuite, j'utilise la fonction get(dataIndex) pour obtenir la propriété que vous voulez du noeud.

Questions connexes