【问题标题】:How to revert the list order back to how it was before the last change if the AJAX request fails?如果 AJAX 请求失败,如何将列表顺序恢复到上次更改之前的状态?
【发布时间】:2019-02-20 12:25:52
【问题描述】:

我使用Sortable JS 库和jQuery 在列表顺序更改时执行AJAX 请求。我是这样做的:

<ul id="items">
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
</ul>

<script type="text/javascript">
  $(document).ready(function() {
    var el = document.getElementById('items');

    Sortable.create(el, {
      onEnd: function (event) {
        var new_position = event.newIndex+1;

        $.ajax({
          type: 'PATCH',
          url: 'path/to',
          data: {'new_position': new_position},
          dataType: 'script'
        }).fail(function(jqXHR, textStatus, errorThrown) {
            // Revert the list order to how it was before the current sort started.
          });
      }
    });
  });
</script>

如果 AJAX 请求失败,我想将列表顺序恢复到上次更改之前的状态。

我怎样才能做到这一点?

【问题讨论】:

  • 也许onSort: function (e) { var clone = $("#items").clone(true); } 然后在替换的ul上替换并重新发出sortable.create

标签: javascript jquery ajax sorting sortablejs


【解决方案1】:

您可以使用 vanilla JS cloneNode 或 jQuery clone 方法克隆列表节点并对克隆的节点进行排序。然后,成功后,您可以将原始节点与克隆节点交换。或者您可以采用另一种方式 - 获取节点,克隆它,对原始节点进行排序,然后在失败时将其与克隆的节点交换,但是我会采用第一种方法(成功时交换),因为您限制了最终的数量DOM 变化。 参考资料:

【讨论】:

  • 您能否提供一个如何在 Sortable 库中使用克隆功能的示例?
  • 我对成功回调解决方案有点困惑(抱歉,考虑了一些不同的库)但这里有一个现成的解决方案,带有可排序和“失败”回调:jsfiddle.net/sLf1u0dn/1
猜你喜欢
  • 2021-04-01
  • 2011-10-21
  • 1970-01-01
  • 2021-04-09
  • 2016-04-16
  • 1970-01-01
  • 2021-05-22
  • 2016-10-05
  • 2020-01-29
相关资源
最近更新 更多