Ho avuto un caso d'uso in cui ho dovuto correre una certa logica nel metodo della caduta del droppable per determinare se il trascinabile dovrebbe ritornare. Ho usato il seguente per raggiungere questo obiettivo:
$('.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');
}
}
});
mio caso d'uso è una tabella in cui ogni cella è un droppable che rappresenta un periodo di 5 minuti. I miei draggable sono prenotazioni che iniziano in una cella, ma passano su molte celle di fila per rappresentare il tempo di prenotazione.
Non volevo che nessun oggetto trascinabile si sovrapponesse, in quanto ciò rappresenterebbe una doppia prenotazione. Quindi, dopo la caduta, trovo tutti i draggables nella riga, escluso quello che ho appena spostato, e controllo eventuali sovrapposizioni.Se si verifica una sovrapposizione, la mia logica condizionale restituisce true e ripristino il trascinamento.
Il passaggio successivo consiste nel generare una chiamata ajax per aggiornare il database, se la logica lato server indica che lo spostamento non è valido, spero di restituire uno stato di errore e di ripristinare il trascinamento.
P.S. questa è la mia prima risposta, scusate se ho fatto qualcosa di sbagliato. Suggerimenti su come fornire buone risposte accettate volentieri.
Modifica: dopo aver provato la mia chiamata AJAX, mi sono reso conto che esiste una finestra di opportunità per la funzione droppable.drop per eseguire la sua operazione prima dell'esecuzione della funzione draggable.revert. Quando la mia chiamata AJAX ha restituito false, la finestra era passata e la classe veniva aggiunta troppo tardi per essere trascinata.
Come tale, non sono più basandosi sulla funzione draggable.revert, invece che agisce esclusivamente in risposta AJAX e se falsa, utilizzando animate() per restituire il draggable alla sua posizione originale, come segue:
$('.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);
}
}
}
});
potrebbe essere necessario avere draggable.start/trascinare aggiungere l'originale sinistra ed i valori superiori della trascinabile come attributi dei dati, ma per me quanto sopra ha funzionato bene.
+1 ottimo aiuto! Grazie! – Sisir