Cómo actualizar un jstree sin desencadenar select_)nodo de nuevo

Estoy usando el jstree plugin, con una llamada ajax. En algún momento, que yo llamo

$("#tree").jstree("refresh");

con el fin de recuperar los nodos nuevos que se han creado a través de una llamada ajax. Esto funciona bien, con la excepción de que select_node.jstree se activa en la actualización. Es allí una manera de prevenir select_node se activa en un árbol de actualización?

  • Lo que no te gusta en select_node.jstree?
InformationsquelleAutor Emilie | 2012-06-21

5 Kommentare

  1. 6

    Terminé usando la configuración de una bandera de la verdad antes de actualizar, y en el select_node desencadenador de eventos, sólo de la ejecución de la lógica si el indicador se establece en false, de lo contrario establecer a false y no hacer nada más:

    refresh = true;
    $("#tree").jstree("refresh");
    
    [...]
    
    $("#tree").jstree({...}).bind("select_node.jstree", function (e, data) {
        if (refresh) {
            refresh = false;
        } else {
           //do my thing
        }
     });
    • jstree hoy en día tiene un método redraw que se adapte a este propósito.
  2. 2

    O puede anular la selección de todos los nodos después de actualizar

    refresh=true;
    $("#tree").jstree("refresh");
    $("#tree").jstree("deselect_all");

    Esto debería funcionar!

  3. 2

    El problema con un tipo bool es que select_node.jstree se activa para cada childnode si el nodo actualmente seleccionado tiene hijos.

    Lugar, hay dos parámetros en la actualización de la función. La segunda puede ser un bool o una función que recibe un objeto de estado con un núcleo.matriz seleccionada con todos los nodos visibles. Si se vacía la matriz y devolver el estado, select_node.jstree no se activará en todos.

            var tree = $('#mytree').jstree(true); 
    
            tree.refresh(false, function (state) {
                //console.dir(state);
                state.core.selected = [];
                return state;
            });
  4. 1

    Si está utilizando la interfaz de usuario de complemento, el refresh() la función «Permite guardar el estado de selección antes de la actualización y de la restauración después». Así, si el nodo seleccionado (antes de actualizar), es hijo del nodo para ser renovado, su estado será restaurado después de actualizar mediante la activación de los vuelva a seleccionar() función. La función de actualización bloqueos como este:

    refresh : function (obj) {
                var _this = this;
                this.save_opened();
                if(!obj) { obj = -1; }
                obj = this._get_node(obj);
                if(!obj) { obj = -1; }
                if(obj !== -1) { obj.children("UL").remove(); }
                else { this.get_container_ul().empty(); }
                this.load_node(obj, function () { 
                    _this.__callback({ "obj" : obj}); 
                    _this.reload_nodes(); //this will trigger the reselect() function
                });

    Yo tenía el mismo problema y me comentó que la línea(esto.reload_nodes()). No creo que sea una solución óptima, pero resuelto mi problema.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea