2010-12-20 12 views
23

Estoy atascado con jsTree aquí. Hasta ahora funciona y puedo buscar y expandir nodos con el ícono [+] y abrir páginas al hacer clic en un nodo, PERO aún quiero que expanda todos los nodos inmediatos cada vez que alguien hace clic en un nodo.¿Abrir la rama al hacer clic en un nodo?

He echado un vistazo a por lo menos 2 horas pero no encontré nada. el sitio web oficial no es muy útil porque no tienen suficientes ejemplos y no está muy bien documentado. tenía un aspecto en este caso, pero no funcionó para mí tampoco: http://luban.danse.us/jazzclub/javascripts/jquery/jsTree/reference/_examples/2_operations.html

ni siquiera un mensaje de error en Firebug

así que aquí es cómo mi código es en este momento, init árbol :

$(function() { 
    $("#jstree").jstree({ 
    .... 

función activa haciendo clic en el nodo

.delegate("a","click", function (e) { 
    //click on node 
    var page_id = $(this).parent().attr("page_id"); 
    var idn = $(this).parent().attr("id").split("_")[1]; 
    /* 
      dosnt seem to work either... 
    $(this).jstree("openNode", $("#node_"+idn)); 
    $(this).jstree("openNode", "#node_"+idn); 
    */ 
    page = "index.php?page_id="+page_id; 
    //location.href = page; 
}) 

no funcionó bien .bind:

$(this).bind("open_node.jstree", function (event, data) { 
    if((data.inst._get_parent(data.rslt.obj)).length) { 
     data.inst._get_parent(data.rslt.obj).open_node(this, false); 
    } 
}) 

¿Alguien ve lo que me falta aquí ...?

Respuesta

1

Uso esto (casoUso es la página vinculada, fInvocaCasoUso es una función para hacer la llamada).

$("#demo1").bind("select_node.jstree", function (e, data) 
        { 
         if (data.rslt.obj.attr("casoUso")!=undefined) 
         { 
          fInvocaCasoUso(data.rslt.obj.attr("casoUso")); 
         } 
         else 
         { 
          $("#demo1").jstree("toggle_node",data.rslt.obj); 
         } 
        }); 

Si el nodo tiene un enlace, se abre, si no, se abre el subárbol. De todos modos, deberías poder combinar ambos lados de "si" para abrir la rama y ejecutar tu enlace. Tal vez ejecución:

 $("#demo1").jstree("toggle_node",data.rslt.obj); 
     fInvocaCasoUso(data.rslt.obj.attr("casoUso")); 

lo haría ...

37

Es necesario que se unen a select_node.jstree y llame toggle_node en la instancia del árbol cuando es disparado:

Para las versiones jsTree < 3.0:

$("#your_tree").bind("select_node.jstree", function(event, data) { 
    // data.inst is the tree object, and data.rslt.obj is the node 
    return data.inst.toggle_node(data.rslt.obj); 
}); 

Para versiones jsTree> = 3,0

$("#your_tree").bind("select_node.jstree", function (e, data) { 
    return data.instance.toggle_node(data.node); 
}); 
+0

Actualizado. Gracias – justind

+0

Funcionó, gracias! Pero los parámetros son diferentes en> = 3. Ver: http://www.jstree.com/api/#/?q=select_node.jstree&f=select_node.jstree Es 'función (nodo, seleccionado, evento)' ahora. –

+0

Nick, ¿puede ampliar la versión actualizada de la función que utilizó para que pueda actualizar la respuesta? En su cambio con los nuevos argumentos, ¿cuál es la nueva llamada toggle_node? 'data.instance.toggle_node (node);'? – justind

3

Con una versión más reciente de jsTree (3.0.0 acuerdo con jsTree.js), que tenía que cambiar el código proporcionado por @justind un poco para trabajar:

$("#jstree").bind("select_node.jstree", function (e, data) { 
    return data.instance.toggle_node(data.node); 
}); 
Cuestiones relacionadas