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