У меня был сценарий использования, когда мне нужно было запустить некоторую логику в методе drop-drop, чтобы определить, следует ли перетаскиваемому объекту вернуться.Для этого я использовал следующее:
$('.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');
}
}
});
Мой пример использования - это таблица, в которой каждая ячейка является опускаемой, представляющей 5-минутный период.Мои перетаскиваемые объекты - это бронирования, которые начинаются в одной ячейке, но охватывают несколько ячеек подряд, чтобы обозначить время бронирования.
Я не хотел, чтобы перетаскиваемые объекты перекрывались, так как это означало бы двойное бронирование.Итак, после удаления я нахожу все перетаскиваемые объекты в строке, исключая только что перемещенный, и проверяю их на совпадения.Если есть совпадение, моя условная логика возвращает true, и я возвращаю перетаскиваемый объект.
Следующий этап - запуск вызова ajax для обновления базы данных, если логика на стороне сервера говорит, что перемещение недопустимо, я надеюсь вернутьсясостояние ошибки и вернуть перетаскиваемый.
PS это мой первый ответ, извините, если я сделал что-то не так.Советы о том, как обеспечить хорошие ответы, с радостью принятые.
Редактировать: Попробовав мой вызов AJAX, я понял, что у функции droppable.drop есть окно, позволяющее сделать свое дело до запуска функции draggable.revert.К тому времени, когда мой вызов AJAX возвратил false, окно прошло, и класс был добавлен слишком поздно для draggable.revert, чтобы среагировать.
Таким образом, я больше не полагаюсь на функцию draggable.revert,вместо этого действует исключительно на ответ AJAX и, если он ложный, использует animate () для возврата перетаскиваемого объекта в исходное положение, как показано ниже:
$( '.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 );
}
}
}
});
Вам может потребоваться, чтобы draggable.start / drag добавлял исходное левое и верхнее значения перетаскиваемого объекта в качестве атрибутов данных, но для меня вышеописанное работало нормально.