Ich hatte einen Anwendungsfall, wo ich, wenn die ziehbar zurückkehren sollte, um bestimmen musste eine gewisse Logik in den abwerfbaren der Drop-Methode ausgeführt werden. Früher habe ich die folgenden dies zu erreichen:
$('.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');
}
}
});
Mein Anwendungsfall ist eine Tabelle, in der jede Zelle eine abwerfbaren die eine Dauer von 5 Minuten ist. Meine Draggables sind Buchungen, die in einer Zelle beginnen, aber über mehrere Zellen hintereinander laufen, um die Buchungszeit darzustellen.
Ich wollte nicht, dass sich irgendwelche Draggables überlappen, da dies eine doppelte Buchung darstellen würde. Also, nach dem Drop finde ich alle ziehbaren Teile in der Reihe, ausgenommen die, die ich gerade bewegt habe, und überprüfe, ob es Überlappungen gibt.Wenn es eine Überlappung gibt, gibt meine bedingte Logik true zurück und ich ziehe die ziehbare zurück.
Die nächste Stufe besteht darin, einen AJAX-Aufruf zu starten, um die Datenbank zu aktualisieren. Wenn die serverseitige Logik angibt, dass die Verschiebung ungültig ist, hoffe ich, einen Fehlerstatus zurückzugeben und den ziehbaren Zustand wiederherzustellen.
P.S. Das ist meine erste Antwort, tut mir leid, wenn ich etwas falsch gemacht habe. Tipps, wie man gute Antworten geben kann, werden gerne angenommen.
Bearbeiten: Nach dem Versuch, meinen AJAX-Aufruf, erkannte ich, gibt es ein Fenster der Gelegenheit für die Funktion droppable.drop, um es zu tun, bevor die draggable.revert-Funktion ausgeführt wird. Zu dem Zeitpunkt, als mein AJAX-Aufruf falsch zurückkehrte, war das Fenster abgelaufen und die Klasse wurde zu spät hinzugefügt, um ziehbar zu sein.
Als solche, ich bin kein Verlass mehr auf die draggable.revert Funktion, sondern ausschließlich auf die AJAX-Antwort und wenn falsch handeln, belebtes() verwendet die ziehbar zurückzukehren zu seiner ursprünglichen Position ist, wie folgt:
$('.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);
}
}
}
});
Sie müssen möglicherweise draggable.start/ziehen die ursprüngliche links hinzufügen und Top-Werte der ziehbar haben als Datenattribute, aber für mich die oben hat gut funktioniert.
+1 große Hilfe! Vielen Dank! – Sisir