miałem przypadek użycia gdzie musiałem uruchomić jakąś logikę w metodzie upuść droppable w celu określenia, czy przeciągany powinna powrócić. Użyłem następujących czynności, aby to osiągnąć:
$('.draggable-elements').draggable({
revert: function() {
if ($(this).hasClass('drag-revert')) {
$(this).removeClass('drag-revert');
return true;
}
}
});
$('.droppable-elements').droppable({
drop: function(event, ui) {
if (% conditional logic check here %) {
return $(ui.draggable).addClass('drag-revert');
}
}
});
Moje przypadek użycia jest tabela, gdzie każda komórka jest droppable reprezentujący okres 5 minut. Moje draggables to rezerwacje, które rozpoczynają się w jednej komórce, ale przechodzą przez wiele komórek z rzędu, aby reprezentować czas rezerwacji.
Nie chciałem, aby przeciągane elementy zachodziły na siebie, ponieważ oznaczałoby to podwójną rezerwację. Tak więc po upuszczeniu znajduję wszystkie przeciągane w rzędzie, z wyjątkiem tego, które właśnie przesunąłem i sprawdzam, czy się nie pokrywają.Jeśli występuje nakładanie się, moja logika warunkowa zwraca wartość true, a ja cofam opcję przeciągania.
Następnym etapem jest wywołanie wywołania ajax, aby zaktualizować bazę danych, jeśli logika po stronie serwera mówi, że ruch jest nieważny Mam nadzieję, że zwróci stan błędu i przywróci działanie przeciągane.
P.S. to jest moja pierwsza odpowiedź, przepraszam, jeśli zrobiłem coś złego. Wskazówki, jak zapewnić dobre odpowiedzi, chętnie akceptowane.
Edycja: Po wypróbowaniu mojego wywołania AJAX zdałem sobie sprawę, że istnieje możliwość skorzystania z funkcji droppable.drop, zanim uruchomiona zostanie funkcja draggable.revert. Do czasu, gdy moje wywołanie AJAX zwróciło wartość false, okno minęło, a klasa została dodana zbyt późno, aby można było przeciągnąć komendę.
Jako takie, ja już nie opierając się na funkcji draggable.revert zamiast działając wyłącznie na odpowiedzi AJAX i czy fałsz, używając animate(), aby powrócić do przesunięcia do jej pierwotnego położenia, co następuje:
$('.draggable-elements').draggable();
$('.droppable-elements').droppable({
drop: function(event, ui) {
var postData = {
id: 1,
...
};
$.post('/ajax/url', postData, function(response) {
var response = $.parseJSON(response);
if (response.status != 1) {
return ui.draggable.animate({left: 0, top: 0}, 500);
}
}
}
});
może trzeba mieć draggable.start/drag dodać oryginalny lewy i najlepszymi wartościami przeciągać jako atrybuty danych, ale dla mnie powyżej działało.
+1 świetna pomoc! Dzięki! – Sisir