开发者

jQuery UI Sortable: Revert changes if update callback makes an AJAX call that fails?

开发者 https://www.devze.com 2022-12-27 18:49 出处:网络
I am using the sortable widget to re-order a list of items. After an item is dragged to a new location, I kick off an AJAX form post to the server to save the 开发者_StackOverflow社区new order. How ca

I am using the sortable widget to re-order a list of items. After an item is dragged to a new location, I kick off an AJAX form post to the server to save the 开发者_StackOverflow社区new order. How can I undo the sort (e.g. return the drag item to its original position in the list) if I receive an error message from the server?

Basically, I only want the re-order to "stick" if the server confirms that the changes were saved.


Try the following:

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


I just encountered this same issue, and for the sake of a complete answer, I wanted to share my solution to this problem:

$('.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);
        }
      },
    });
  }
});

You'll need to modify it to suit your codebase, but this is a completely multithread safe solution that works very well for me.


I'm pretty sure that sortable doesn't have any undo-last-drop function -- but it's a great idea!

In the mean time, though, I think your best bet is to write some sort of start that stores the ordering, and then on failure call a revert function. I.e. something like this:

$("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 */
         }
});

Would love to know if others have a better answer, though.

0

精彩评论

暂无评论...
验证码 换一张
取 消