2010-04-23 3 views
19

정렬 가능한 위젯을 사용하여 항목 목록을 재정렬합니다. 항목을 새 위치로 드래그 한 후 서버에 AJAX 양식 게시를 시작하여 새 주문을 저장합니다. 서버에서 오류 메시지가 표시되면 어떻게 정렬을 취소 할 수 있습니까 (예 : 목록에서 드래그 항목을 원래 위치로 되돌릴 수 있습니까?).jQuery UI Sortable : 업데이트 콜백으로 인해 AJAX 호출에 실패하면 변경 사항을 되돌릴 수 있습니까?

기본적으로 서버가 변경 사항이 저장되었다는 것을 확인한 경우에만 재 배열을 "고정"하고 싶습니다.

답변

2

필자는 sortable에 undo-last-drop 기능이 없다고 확신하지만, 좋은 생각입니다!

하지만, 최선의 방법은 순서를 저장하는 일종의 start을 작성한 다음 실패하면 되돌리기 기능을 호출하는 것입니다. 나는. 다음과 같이 입력하십시오 :

$("list-container").sortable({ 
    start: function() { 
      /* stash current order of sorted elements in an array */ 
     }, 
    update: function() { 
      /* ajax call; on failure, re-order based on the stashed order */ 
     } 
}); 

다른 사람들이 더 좋은 답변을 갖고 있는지 알고 싶습니다.

+0

페이지로드시 처음에 전체 정렬 가능 항목을 복제하고 안전하게 보관할 수 있도록 변수에 채 웁니다. 아약스 저장 성공에 나는 최신 정렬 (복제 다시) 복제 변수를 바꿉니다. 오류가 발생하면 sortable을 복제본으로 바꾸고 정렬 가능으로 다시 초기화합니다. 지금까지 괜찮은 것 같아 ... – Ryan

+1

답변으로 게시하여 upvoted 수 있습니까? :) –

24

는 다음과 같은 시도 : 난 그냥이 같은 문제가 발생

$(this).sortable('cancel'); 
+1

한 번에 하나의 업데이트를 게시했지만 이것은 나를 위해 일했습니다. – Joe

+0

ajax는 대개 비동기이므로 실제로 작동하려면 jquery 요청에서 async를 false로 설정하여 ajax 요청의 sortable beforeStop 메소드에서 대기/절전해야합니다. – Ryan

+0

@Ryan 백엔드가 변경 사항을 유지하지 못하고 방금 작업 한 경우 UI 정렬을 위해'$ elem.sortable ('cancel')'을 사용했습니다. 그것은'취소 '가 ** 마지막 수정 **을 항목의 배열에서 취소 한 것처럼 보입니다 (페이지 또는 무언가를 새로 고치지 않는 한). –

6

을하고 완전한 답변을 위해서, 나는이 문제에 대한 내 솔루션 공유하기를 원해요 :

$('.list').sortable({ 
    items:'.list:not(.loading)', 
    start: function(event,ui) { 
    var element = $(ui.item[0]); 
    element.data('lastParent', element.parent()); 
    }, 
    update: function(event,ui) { 
    var element = $(ui.item[0]); 
    if (element.hasClass('loading')) return; 
    element.addClass('loading'); 
    $.ajax({ 
     url:'/ajax', 
     context:element, 
     complete:function(xhr,status) { 
     $(this).removeClass('loading'); 
     if (xhr.status != 200) { 
      $($(this).data('lastParent')).append(this); 
     } 
     }, 
    }); 
    } 
}); 

당신을 ' 코드베이스에 맞게 수정해야하지만 완전히 잘 작동하는 멀티 스레드 보안 솔루션입니다.

+1

고마워요! 나를 도와 줬어! –

+0

감사합니다. 훌륭한 코드 조각. 플러그 앤 플레이! :) – gabn88

관련 문제