2010-08-27 5 views
21

Commencé à jouer avec jQuery et le plugin jsTree hier, et l'avoir chargé avec succès l'arbre avec un appel AJAX à une servlet. Maintenant, je voudrais que l'arbre ouvre tous les nœuds après le chargement, donc j'ai ajouté une fonction de succès à l'attribut ajax. Cependant, je n'arrive pas à obtenir la méthode open_all() pour fonctionner correctement. Je suis très novice dans le travail avec jQuery, donc je suppose que c'est quelque chose de simple que je fais mal. Firebug ne montre aucune erreur qui exclut l'erreur stupide de nom de méthode mal typée. J'ai vérifié la documentation et je pense que je fais tout correctement selon ce que j'ai lu. L'arborescence se charge correctement, mais n'ouvre pas tous les nœuds après le chargement de la page. J'utilise jQuery 1.4.2 et jsTree 1.0rc2 sur Firefox 3.6.8.Pourquoi jsTree open_all() ne fonctionne pas pour moi?

Voici le code que je utilise pour charger l'arbre et essayez d'ouvrir tous les nœuds dans l'arbre:

// Create the tree object 
$("td#modelXML").jstree({ 
    core : { "animation" : 0 }, 
    //xml_data : {"data" : "" + xml, "xsl" : "nest"}, 
    xml_data : {"ajax" : 
        {"url" : "servlet/GetModelHierarchy", 
        "type" : "post", "data" : { modelId : "" + modelId} }, 
        "xsl" : "nest", 
        "success" : function(){ 
           $(this).open_all(-1); 
           } 
    }, 
    themes : {"theme" : "classic", "dots" : true, "icons" : true}, 
    types : { 
     "types" : { 
      "category" : { 
       "valid_children" : ["factor"] 
      }, 
      "factor" : { 
       "valid_children" : ["level"] 
      }, 
      "level" : { 
       "valid_children" : "none", 
       "icon" : { 
        "image" : "${request.contextPath}/jsTree/file.png" 
       } 
      } 
     } 
    }, 
    plugins : ["themes", "types", "xml_data"] 
}); 

Répondre

38

Vous devez brancher sur les événements, puis appelez open_all.

Pour avoir tous les noeuds ouverts sur la charge, utilisez:

var tree = $("#id-or-selector-for-my-tree-element"); 
    tree.bind("loaded.jstree", function (event, data) { 
     tree.jstree("open_all"); 
    }); 

Est-ce que ce qui précède, avant d'initialiser l'arbre avec .jstree({...}).

Si vous actualisez, puis d'avoir tous les noeuds ouverts à nouveau, vous devez utiliser:

tree.bind("refresh.jstree", function (event, data) { 
     tree.jstree("open_all"); 
    }); 
20

Oui, cela est une question ancienne, mais sans réponse acceptée et ayant la seule réponse ne pas être utile pour moi, voici ma réponse que je l'utilise maintenant:

var tree = $("td#modelXML") 
    .bind("loaded.jstree", function (e, data) { 
     data.inst.open_all(-1); // -1 opens all nodes in the container 
    }) 
    .jstree({ /* your jsTree options as normal */ }); 

le point clé ici est que data.inst est votre jsTree, et est le seul refere nce vous aurez disponible car tree n'aura pas de valeur avant la fin du .jstree({. Puisque loaded.jstree est appelé dans l'appel .jstree({, le résultat n'existe pas encore. Voir?

+3

+1 Cette méthode a fonctionné pour moi, la réponse acceptée n'a pas fonctionné. – RedFilter

+0

De toute façon pour faire ce travail après une actualisation? L'événement chargé ne semble pas déclencher. Y a-t-il un autre événement qui indique quand les données sont chargées? – Jens

+0

pour jstree v3 vous avez maintenant besoin de ceci (j'ouvrais le nœud racine seulement) '.on ('loaded.jstree', fonction (événement, données) { data.instance.open_node ('0') })' – KeepCalmAndCarryOn

1

Essayez ceci!

$("td#modelXML").jstree("open_all","#nodeID"); 
+0

cela ne fonctionne pas pour moi pour certaines raisons – user367134

2

J'étais complètement incapable de faire fonctionner soit avec tree.jstree('open_all') ou data.inst.open_all(-1) - à la fin que je devais utiliser data.instance.open_all() - remarquez le changement de INST exemple, et open_all (-1) juste open_all() - les deux semblent être requis avec jQuery 1.11 et jstree 3.0.0. Mon bloc de code final ressemble à ceci:

$(document).ready(function() { 
    var tree = $('#jstree'); 
    tree.bind('loaded.jstree', function(event, data) { 
     data.instance.open_all(); 
    }); 
    tree.jstree({}); 
}); 
Questions connexes