2010-10-28 15 views
2

Je rends un arbre en utilisant un tableau Jason que je reçois d'une page jsp. Ainsi, l'arbre a un nœud racine et 3 nœuds et chaque nœud a plus de 5 enfants et certains des enfants ont le même identifiant et le même texte. Il rend correctement et aucun problème à l'affichage.ExtJS Tree same parentNode

J'essaie de faire en sorte que l'utilisateur sélectionne les nœuds enfants d'un seul type (l'un des trois nœuds). Si l'utilisateur sélectionne un nœud qui n'est pas le frère d'un nœud déjà existant, il suffit de désactiver les nœuds déjà vérifiés. Cela semble assez simple et je l'ai codé. J'ai fondamentalement comparé les nœuds parents (node.parentNode.id) du nœud vérifié avec les nœuds déjà vérifiés (tree.getCheckedNodes())

le problème est quand je sélectionne des nœuds enfants qui ont le même id et le même texte ma logique échoue et ils disent qu'ils ont même parentNode.id même s'ils ont différent parentNode.id. Le panneau d'arbre vérifie-t-il les éléments en double et les affecte-t-il au même parent lors du chargement? Qu'est-ce qui se passe ici et comment résoudre ce problème? Je vous remercie.

Ext.onReady(function(){ 
    var tree = new Ext.tree.TreePanel({ 
    id: 'deficiencyTree', 
    renderTo: 'MyTable', 
    title: 'Deficiencies', 
    height: 'auto', 
    width: 525, 
    useArrows: true, 
    autoScroll: true, 
    animate: true, 
    enableDD: true, 
    containerScroll: true, 
    rootVisible: false, 
    frame: false, 
    root:{nodeType: 'async'}, 
    dataUrl: 'jsonFile.jsp', 
    listeners: {  
     'checkchange': function (node, checked) { 

     if (checked) { 
      selNodes = tree.getChecked(); 
      alert(selNodes);  
      Ext.each(selNodes, function (nodes) { 

    alert("id values for node and nodes "+node.parentNode.id+" "+nodes.parentNode.id); 

      if (nodes.parentNode.id != node.parentNode.id) 
      { 
      nodes.getUI().toggleCheck();    
      }  

      }); 
     }  
     list.length = 0; 
     iii = 0; 
     selNodess = tree.getChecked(); 
     Ext.each(selNodess, function (nodes) { 
      list[iii] = nodes.id; 
      iii++; 
     }); 
     } 
    } 
    }); 
    tree.getRootNode().expand(false); 
}); 

Répondre

1

En tant que semi-apart, idéalement, vous ne devriez pas du tout répliquer les ID de nœud (un ID ne devrait jamais être répliqué, sinon ce n'est pas un ID). Si vous avez besoin de la valeur que vous attribuez actuellement au champ ID, ajoutez un attribut supplémentaire au nœud et placez-le ici. Vous pouvez vous référer à cet attribut lorsque vous en avez besoin. ExtJS n'est pas conçu pour gérer les ID en double pour les notes dans le même arbre très bien.

+0

Oui, j'ai besoin de cet attribut ID plus tard pour enregistrer mes sélections dans la base de données. J'ai donc essayé de mettre un nouvel attribut nommé ID2, le long de l'ID et du texte pour chaque nœud, mais quand j'ai essayé d'y accéder (node.ID2 comme node.id, node.text), il est dit undefined. une idée de comment accéder au nouvel attribut? Merci. –

0

J'utilisé hierarhical ids pour résoudre ce problème: donc si le chemin à l'élément était x ->y ->z alors sa carte d'identité dans l'arbre sera x+y+z

vous avez juste besoin de changer côté serveur Code: - obtenir l'identifiant au format x+y+z, trouver la dernière + et obtenir z - Retour éléments avec ids [x+y+z+childId]

+0

Cela ressemble à une bonne logique, mais j'attribue les ID de la table de base de données (valeur clé primaire) et aucun moyen de changer cela. Veuillez me corriger si j'ai compris votre suggestion autrement. merci –

+0

Vous utilisez des identifiants modifiés uniquement en correspondance entre la page et le serveur. Le serveur peut enregistrer des identifiants de quelque manière que ce soit. Vous avez juste besoin de créer du code qui convertit l'identifiant du serveur en ID "+" et en arrière. –

+0

Voici mon code java: ... String nodeId = request.getParameter ("node"); Chaîne docId = null; int pin = nodeId.lastIndexOf ("+"); if (pin> 0) { docId = nœudIdstructure (broche + 1, broche + 33); } else { docId = nodeId; } ... ... JSONArray json = new JSONArray(); pour (String clé: result.keySet()) { JSONObject entity = new JSONObject(); entity.put ("text", result.get (clé)); entity.put ("id", nodeId + "+" + clé); entity.put ("cls", "dossier"); json.put (entity); } out = json.toString(); ... –

0

Bonne nouvelle. Je l'ai fait fonctionner. c'était plutôt simple. Comme "Xupypr MV" suggéré, je ne devrais pas utiliser le même ID qui est contre la fonctionnalité de base, donc j'ai mis un ID différent pour chaque nœud et mettre un nouvel attribut nommé id2 et lui assigner la valeur dont j'avais besoin en utilisant node.attribute ["id2"], et cela fonctionne parfaitement bien. Auparavant, j'ai essayé d'obtenir la valeur de l'attribut en tant que node.id2, tout comme node.id, node.text qui ne fonctionnait pas. Merci encore pour les réponses.