代码之家  ›  专栏  ›  技术社区  ›  Seth Petry-Johnson

jquery ui可排序:如果更新回调发出失败的Ajax调用,是否恢复更改?

  •  21
  • Seth Petry-Johnson  · 技术社区  · 14 年前

    我正在使用可排序小部件重新订购项目列表。当一个项目被拖到一个新的位置后,我开始向服务器发送一个Ajax表单,以保存新的订单。如果从服务器收到错误消息,如何撤消排序(例如,将拖动项返回到列表中的原始位置)?

    基本上,我只希望在服务器确认更改已保存的情况下重新订购“stack”。

    3 回复  |  直到 8 年前
        1
  •  2
  •   brahn    14 年前

    我很确定Sortable没有任何撤销上次删除的功能——但这是一个好主意!

    同时,我认为你最好的选择是写一些 start 它存储排序,然后在失败时调用一个revert函数。也就是这样:

    $("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
  •  28
  •   VisioN    11 年前

    尝试以下操作:

    $(this).sortable('cancel');
    
        3
  •  6
  •   Caleb Gray    12 年前

    我刚刚遇到了同样的问题,为了得到一个完整的答案,我想分享我对这个问题的解决方案:

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

    您需要修改它以适应您的代码库,但这是一个完全多线程安全的解决方案,对我来说非常有效。