2012-02-02 23 views
6

Estoy tratando de averiguar cómo deshacer solo un nodo de carpeta que no se movió correctamente. El siguiente código es un ejemplo de lo que intento hacer. El problema surge cuando seleccionas un par de carpetas y las mueves a otra carpeta. Si uno de los directorios no se puede mover, quiero poder retrotraerlo a su padre original. Desafortunadamente $.jstree.rollback(data.rlbk); cancela todas las carpetas que se seleccionaron en sus ubicaciones anteriores.Cómo deshacer nodos que no se pudieron mover en jstree

$("#tree").jstree({...}).bind("move_node.jstree", function (e, data) { 
    // process all selected nodes directory 
    data.rslt.o.each(function (i) { 
     // Send request. 
     var move = $.parseJSON($.ajax({ 
      url: "./jstree.php", 
      type: 'post', 
      async: false, 
      data: { 
       operation: "move_dir", 
       .... 
      } 
     }).responseText); 
     // When everything's ok, the reponseText will be {success: true} 
     // In all other cases it won't exist at all. 
     if(move.success == undefined){ 
      // Here I want to rollback the CURRENT failed node. 
      // $.jstree.rollback(data.rlbk); will rollback all 
      // of the directories that have been moved. 
     } 
    } 
}); 

¿Hay alguna manera de hacerlo?

Respuesta

1

He examinado el uso de jstree antes, pero no lo he usado en mi código. Como resultado, el código puede no ser correcto, pero los conceptos deberían serlo.

Según su código, parece que está realizando la operación de mover en el lado del servidor y desea que el árbol se actualice para reflejar los resultados.

Según la documentación de jsTree, parece que no puede confirmar actualizaciones de nodo y retrotraer a la última confirmación.

En lugar de deshacer solo los cambios que no desea, puede revertir el árbol (todos los cambios) y realizar los movimientos posteriores.

Para comprender mejor el siguiente código, puede leerlo (o crear una copia) sin las líneas donde "wasTriggeredByCode" está establecido o referenciado en la condición para una instrucción "if".

$("#tree").jstree({...}).bind("move_node.jstree", function (e, data) { 

    var jsTree = $(this); 
    var successes = []; 

    // Becomes true when function was triggered by code that updates jsTree to 
    // reflect nodes that were successfully moved on the server 
    var wasTriggeredByCode = false; 

    // process all selected nodes directory 
    data.rslt.o.each(function (i) { 

     // I'm not certain that this is how the node is referenced 
     var node = $(this); 

     wasTriggeredByCode = (wasTriggeredByCode || node.data('redoing')); 

     // Don't perform server changes when event was triggered from code 
     if (wasTriggeredByCode) { 
      return; 
     } 

     // Send request. 
     var move = $.parseJSON($.ajax({ 
      url: "./jstree.php", 
      type: 'post', 
      async: false, 
      data: { 
       operation: "move_dir", 
       .... 
      } 
     }).responseText); 

     if(move.success){ 
      successes.push(node); 
     } 
    }); 

    // Don't continue when event was triggered from code 
    if (wasTriggeredByCode) { 
     return; 
    } 

    // Roll back the tree here 
    jsTree.rollback(data.rlbk); 

    // Move the nodes 
    for (var i=0; i < successes.length; i++) { 
     var node = successes[i]; 

     // According to the documentation this will trigger the move event, 
     // which will result in infinite recursion. To avoid this you'll need 
     // to set a flag or indicate that you're redoing the move. 
     node.data('redoing', true); 

     jsTree.move_node(node, ...); 

     // Remove the flag so that additional moves aren't ignored 
     node.removeData('redoing'); 
    } 
}); 
+0

Lamentablemente, no puedo aceptar esta respuesta, porque para cuando se publicó ya he escrito un plugin de jquery similar que tenía todo lo que necesitaba. Perdón por mi respuesta tardía, pero veo que la gente está votando y, por lo tanto, creo que debería decir por qué no acepté ninguna respuesta. Dejo esta pregunta abierta, así que si alguien encuentra útil la respuesta de @ DaveF, ¡por favor hágala votar! – tftd

+0

@tftd Ayudaría si pudieras compartir tu complemento, si no te importa, por supuesto. – alejosoft

Cuestiones relacionadas