2012-02-02 13 views
6

Sto cercando di capire come eseguire il rollback solo su un nodo di cartella che non è stato spostato correttamente. Il codice seguente è un esempio di ciò che sto cercando di fare. Il problema si presenta quando hai selezionato un paio di cartelle e le hai spostate in un'altra cartella. Se una delle directory non viene spostata, voglio essere in grado di riportarla al suo genitore originale. Purtroppo $.jstree.rollback(data.rlbk); esegue il rollback di tutte le cartelle che sono state selezionate nelle posizioni precedenti.Come ripristinare i nodi che non è possibile spostare in 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. 
     } 
    } 
}); 

C'è un modo per fare questo?

risposta

1

Ho guardato prima usando jstree, ma non l'ho usato nel mio codice. Di conseguenza, il codice potrebbe non essere corretto, ma i concetti dovrebbero essere.

In base al codice, sembra che si stia eseguendo l'operazione di spostamento sul lato server e si desideri che l'albero venga aggiornato per riflettere i risultati.

In base alla documentazione di jsTree, sembra che non sia possibile eseguire il commit degli aggiornamenti dei nodi e tornare all'ultima commit.

Invece di ripristinare solo le modifiche che non si desidera, è possibile ripristinare l'albero (tutte le modifiche) ed eseguire le mosse in seguito.

Per comprendere meglio il codice riportato di seguito, è possibile leggerlo (o crearne una copia) senza le righe in cui "wasTriggeredByCode" è impostato o referenziato nella condizione per un'istruzione "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

Sfortunatamente, non posso accettare questa risposta, perché quando è stato pubblicato ho già scritto un plugin jQuery simile da zero che aveva tutto ciò di cui avevo bisogno. Ci scusiamo per la mia risposta in ritardo, ma vedo gente che upgoting e quindi sento che dovrei dire perché non ho accettato alcuna risposta. Sto lasciando aperta questa domanda, quindi se qualcuno trova utile la risposta di @DaveF, si prega di revocarlo! – tftd

+0

@tftd Sarebbe d'aiuto se potessi condividere il tuo plugin, se non ti dispiace, naturalmente. – alejosoft

Problemi correlati