Подтвердить что ты не робот

JQuery UI Sortable: отменять изменения, если обратный вызов обновления вызывает отказ AJAX?

Я использую сортируемый виджет, чтобы переупорядочить список элементов. После того, как элемент перетаскивается в новое место, я запускаю сообщение формы AJAX на сервер, чтобы сохранить новый порядок. Как я могу отменить сортировку (например, вернуть элемент перетаскивания в исходное положение в списке), если я получаю сообщение об ошибке с сервера?

В принципе, я хочу, чтобы повторный заказ "вставил", если сервер подтверждает, что изменения были сохранены.

4b9b3361

Ответ 1

Я уверен, что сортировка не имеет функции отмены-последнего-падения, но это отличная идея!

Тем временем, я думаю, что лучше всего написать какой-то start, который хранит заказ, а затем при отказе вызывать функцию возврата. То есть что-то вроде этого:

$("list-container").sortable({
  start: function () { 
           /* stash current order of sorted elements in an array */
         },
  update: function () {
          /* ajax call; on failure, re-order based on the stashed order */
         }
});

Хотелось бы узнать, есть ли у других лучший ответ.

Ответ 2

Попробуйте следующее:

$(this).sortable('cancel');

Ответ 3

Я только что столкнулся с этой же проблемой, и для полного ответа я хотел поделиться своим решением этой проблемы:

$('.list').sortable({
  items:'.list:not(.loading)',
  start: function(event,ui) { 
    var element = $(ui.item[0]);
    element.data('lastParent', element.parent());
  },
  update: function(event,ui) {
    var element = $(ui.item[0]);
    if (element.hasClass('loading')) return;
    element.addClass('loading');
    $.ajax({
      url:'/ajax',
      context:element,
      complete:function(xhr,status) {
        $(this).removeClass('loading');
        if (xhr.status != 200) {
          $($(this).data('lastParent')).append(this);
        }
      },
    });
  }
});

Вам нужно будет изменить его в соответствии с вашей кодовой базой, но это полностью многопоточное безопасное решение, которое очень хорошо работает для меня.