2010-04-23 11 views
19

Używam widgetu do sortowania, aby zmienić kolejność elementów. Po przeciągnięciu elementu do nowej lokalizacji uruchamiam post z formularza AJAX na serwerze, aby zapisać nowe zamówienie. Jak mogę cofnąć sortowanie (np. Przywrócić pozycję przeciągania do pierwotnej pozycji na liście), jeśli otrzymam komunikat o błędzie z serwera?jQuery UI Sortable: Przywrócić zmiany, jeśli wywołanie zwrotne aktualizacji powoduje wywołanie AJAX, które nie powiedzie się?

Zasadniczo chcę zmienić kolejność, aby "trzymać", jeśli serwer potwierdzi, że zmiany zostały zapisane.

Odpowiedz

2

Jestem prawie pewna, że ​​sortable nie ma żadnej funkcji "Undo-last-drop" - ale to świetny pomysł!

W międzyczasie myślę, że najlepiej jest napisać coś w rodzaju: start, która przechowuje zamowienie, a następnie po niepowodzeniu wywołać funkcję przywracania. To znaczy. coś takiego:

$("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 */ 
     } 
}); 

Chciałbym wiedzieć, czy inni mają lepszą odpowiedź.

+0

Po prostu sklonuję cały możliwy do sortowania ładunek na stronie i umieszczam go w zmiennej w celu bezpiecznego przechowywania. W przypadku ajax save success zastępuję zmienną klona najnowszym sortable (klon ponownie). Przy błędzie zastępuję sortable klonem (i reinicjuję go jako sortowalny). Wydaje się, że do tej pory wszystko działa dobrze ... – Ryan

+1

Czy możesz napisać to jako odpowiedź, aby można było przegłosować? :) –

24

Spróbuj wykonać następujące czynności:

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

To działało dla mnie, chociaż zamieszczałem jedną aktualizację na raz. – Joe

+0

ajax jest zwykle asynchroniczny, więc aby to faktycznie zadziałało musisz poczekać/spać w sortowalnej metodzie beforeStop dla żądania ajax, być może ustawiając asynchroniczne na false na żądanie jquery. – Ryan

+0

@Ryan Użyłem sortowania '$ elem.sortable ('cancel')' do _undo_ UI, jeśli backend nie przetrwał zmian i po prostu zadziałało. Wydaje się, że 'cancel' cofa ** ostatnią modyfikację ** do rozmieszczenia elementów bez względu na to, ile czasu minęło (chyba że ktoś odświeży stronę lub coś takiego). –

6

prostu napotkał ten sam problem, a ze względu na pełną odpowiedź, chciałem podzielić się moją rozwiązanie tego problemu:

$('.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); 
     } 
     }, 
    }); 
    } 
}); 

you” Będziesz musiał zmodyfikować go tak, by pasował do twojego kodu, ale jest to całkowicie bezpieczne rozwiązanie wielowątkowe, które działa bardzo dobrze.

+1

Dziękujemy! pomógł mi tonę! –

+0

Dziękujemy! Świetny kawałek kodu. Podłącz i graj! :) – gabn88

Powiązane problemy