2012-02-02 1 views
6

성공적으로 이동되지 않은 폴더 노드 만 롤백하는 방법을 알아 내려고하고 있습니다. 아래 코드는 내가하려는 일의 예입니다. 두 개의 폴더를 선택하고 다른 폴더로 옮길 때 문제가 발생합니다. 디렉토리 중 하나가 이동되지 않으면 원래의 부모로 롤백 할 수 있기를 원합니다. 불행히도 $.jstree.rollback(data.rlbk);은 이전 위치로 선택된 모든 폴더를 롤백합니다.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. 
     } 
    } 
}); 

이 작업을 수행 할 수있는 방법이 있습니까?

답변

1

jstree를 사용하여 보았지만 코드에서 사용하지 않았습니다. 결과적으로 코드가 정확하지 않을 수 있지만 개념이 있어야합니다.

코드에 따르면 서버 측에서 이동 작업을 수행하고 결과를 반영하도록 트리를 업데이트하려는 것처럼 보입니다.

jsTree 설명서에 따르면 노드 업데이트를 커밋하고 마지막 커밋으로 롤백 할 수없는 것처럼 보입니다.

원하지 않는 변경 사항 만 롤백하는 대신 트리 (모든 변경 사항)를 롤백하고 이후에 이동을 수행 할 수 있습니다.

아래 코드를 더 잘 이해하기 위해 "if"문에 대한 조건에서 "wasTriggeredByCode"가 설정되거나 참조되는 줄이 없으면이를 읽거나 복사본을 만들 수 있습니다.

$("#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

불행히도, 나는 이미 내가 필요한 모든 것을 가지고 처음부터 비슷한 jquery 플러그인을 작성했기 때문에이 답변을 받아 들일 수 없습니다. 나의 늦은 응답을 위해 유감스럽게 생각한다, 그러나 나는 사람을 상향 투표하는 것을 본다. 그리고 나는 내가 왜 어떤 대답을 받아들이지 않았 느냐고 말해야한다고 느낀다. 나는이 질문을 공개적으로 남겨두고 있으므로 @DaveF의 답변이 도움이된다면 upvote 해주세요! – tftd

+0

@tftd 물론 상관 없으면 플러그인을 공유 할 수 있다면 도움이 될 것입니다. – alejosoft