Tôi đã có một trường hợp sử dụng mà tôi đã phải chạy một số logic trong phương pháp thả của droppable để xác định xem có thể kéo nên hoàn nguyên. Tôi đã sử dụng sau đây để đạt được điều này:
$('.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');
}
}
});
trường hợp sử dụng của tôi là một bảng trong đó mỗi tế bào là một droppable đại diện cho một khoảng thời gian 5 phút. Kéo của tôi là các đặt chỗ bắt đầu trong một ô, nhưng chạy qua nhiều ô liên tiếp để thể hiện thời gian đặt trước.
Tôi không muốn bất kỳ hình thu nhỏ nào có thể chồng lên nhau, vì điều đó sẽ đại diện cho đặt phòng đôi. Vì vậy, sau khi thả, tôi tìm thấy tất cả các vật kéo trong hàng, ngoại trừ cái tôi vừa di chuyển và kiểm tra bất kỳ sự chồng chéo nào.Nếu có một chồng chéo, logic điều kiện của tôi trả về true và tôi hoàn nguyên khả năng kéo được.
Giai đoạn tiếp theo là kích hoạt cuộc gọi ajax để cập nhật cơ sở dữ liệu, nếu logic phía máy chủ cho biết di chuyển không hợp lệ, tôi hy vọng trả lại trạng thái lỗi và hoàn nguyên khả năng kéo.
P.S. đây là câu trả lời đầu tiên của tôi, xin lỗi nếu tôi đã làm bất cứ điều gì sai trái. Lời khuyên về cách cung cấp câu trả lời tốt sẵn sàng chấp nhận.
Chỉnh sửa: Sau khi thử cuộc gọi AJAX, tôi nhận ra có một cửa sổ cơ hội cho hàm droppable.drop thực hiện điều đó trước khi chức năng draggable.revert chạy. Vào lúc cuộc gọi AJAX của tôi trả về false, cửa sổ đã trôi qua và lớp được thêm vào quá muộn để draggable.revert phản ứng lại.
Như vậy, tôi không còn dựa vào chức năng draggable.revert, thay vì diễn xuất hoàn toàn vào các phản ứng AJAX và nếu sai sự thật, sử dụng animate() để trả lại kéo đến vị trí ban đầu, như sau:
$('.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);
}
}
}
});
Bạn có thể cần phải có draggable.start/kéo thêm trái gốc và giá trị hàng đầu của kéo như dữ liệu thuộc tính, nhưng đối với tôi là làm việc tốt ở trên.
+1 trợ giúp tuyệt vời! Cảm ơn! – Sisir