【问题标题】:jQuery UI sortable - restore original position after ajax errorjQuery UI 可排序 - ajax 错误后恢复原始位置
【发布时间】:2014-07-29 04:17:31
【问题描述】:

当用户更改列表元素的顺序时,我使用 ajax 使用新顺序更新数据库。

但是,如果数据库由于某种原因无法保存,我会报错。如何恢复 li 元素的原始位置?

$('.sortable').sortable({
  opacity: '0.5',
  start: function(event,ui) { 
    var element = $(ui.item[0]);
    element.data('lastParent', element.parent());
  },
  update: function(e, ui) {
    var neworderSer = $(this).sortable("serialize");
    var neworderArray = $(this).sortable('toArray');

    $.ajax({
        url: "/btstadmin/pages/reorder.json",
        type: "post",
        dataType:"json",
        data: neworderSer,
        success: function(feedback) {
          notify('Reordered pages');
        },
        error: function(e) {
          $($(this).data('lastParent')).append(this);
          notify('Reordered pages failed', {
              status: 'error'
          });
        }
    });      
    for (var i=0; i < neworderArray.length; i++) {
      if (i==0) {
        $("#"+neworderArray[i]+" .pageNum").fadeOut().text( "Cover" ).fadeIn();
      }else {
        $("#"+neworderArray[i]+" .pageNum").fadeOut().text( "Page "+i ).fadeIn();
      }
    }
  }
});

我真正需要的是存储整个 Ul

<ul id="pageMenu" class="nav nav-pills nav-stacked sortable ui-sortable">
    <li class="" id="item_4">
        <a href="/btstadmin/pages/view/4">keiths page1</a>
    </li>
    <li class="" id="item_5">
        <a href="/btstadmin/pages/view/5">keiths page2</a>
    </li>
    <li class="" id="item_6">
        <a href="/btstadmin/pages/view/6">keiths page3</a>
    </li>
</ul>

更新: 当我使用 start 时:我得到了 sortable 临时添加的额外代码。我需要 beforeStart 之类的东西,或者只捕获没有添加内联样式的原始项目。

  start: function(event, ui) { 
    prevPositions = $(".sortable").html();
  },

这给了我:

<ul id="pageMenu" class="nav nav-pills nav-stacked sortable ui-sortable">
    <li class="" id="item_3">
        <a href="/btstadmin/pages/view/3">Cover</a>
    </li>
     <li class="" id="item_4" style="width: 261px; height: 54px; position: absolute; opacity: 0.5; z-index: 1000;">
        <a href="/btstadmin/pages/view/4">keiths page1</a>
    </li>
         <li class="ui-sortable-placeholder" style="visibility: hidden; height: 54px;"></li>
     <li class="" id="item_7">
        <a href="/btstadmin/pages/view/7">test page 2</a>
     </li>
</ul>

【问题讨论】:

    标签: javascript jquery jquery-ui


    【解决方案1】:

    jQuery UI 本身不提供这样的功能。所以你可以用任何一种方式做到这一点:

    • 根据 id 属性对元素进行排序并重新附加到可排序对象 容器。忙碌的工作。
    • 创建可排序元素的副本并在需要时重置。更简单。

    我更喜欢第二种选择。创建副本

    var unOrderedList = $("#sortable").html();
    

    使用refreshrefreshPositions,然后将列表重置为。 Documentation

    error: function(e) {
          $("#sortable").html(unOrderedList);
          $("#sortable").sortable("refreshPositions");
                     }
    

    这是Working Fiddle

    【讨论】:

    • 谢谢。我收到一个错误 Uncaught ReferenceError: unOrderedList is not defined。我已经开始: function() { var unOrderedList = $(".sortable").html(); },我从错误中得到错误:function(e) { $(".sortable").html(unOrderedList);
    • 我把 var unOrderedList = $("#sortable").html();进入启动函数,因为我需要在 ajax 调用之前拍摄快照。 $("#sortable").html();在拖动过程中记录元素,添加了一些额外的 html 和 css 样式
  • 你可以通过使用 unOrderedList = $(".sortable").html();试了一下,看看错误是否仍然存在
  • 是的,我把它变成了全球性的并且它工作了。问题在于使用 start:它在拖动时捕获状态,Sortable 插件在其中添加了一些临时 html。每次开始前我都需要抓拍。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签