【问题标题】:Sortable - Update Existing Array - jQuery可排序 - 更新现有数组 - jQuery
【发布时间】:2021-04-23 17:26:54
【问题描述】:

我有一个现有的元素数组,例如:

arr=[{name:1,data:xyz},{name:2,data:abc},{name:3, data:lmn}; {name:4,data:opq}]

这些项目是根据它们在 UI 上的名称填充的。 示例:1 2 3 4 5

我已经实现了 jQuery 的 Sortable。在用户对上述元素执行拖放操作后,我希望根据元素的新位置更新现有数组arr,而不是创建新数组。

用户可以移动存在于数组arr 中的元素,并且不能从1 2 3 4 5 元素列表之外引入任何拖动的对象,例如:2 可以移动到 5 或 1 可以移动到 3 等等。

元素 HTML:

<ul class= "tree-list">
 <li class="li_class"><span class="span_class"> 1 </span></li>
 <li class="li_class"><span class="span_class"> 2 </span></li>
 <li class="li_class"><span class="span_class"> 3 </span></li>
 <li class="li_class"><span class="span_class"> 4 </span></li>
 <li class="li_class"><span class="span_class"> 5 </span></li>
</ul>

jQuery:

 $(function() {
            var data = $(".tree-list").sortable({
              delay: 150,
              axis: "y",
      
            update: function(event, ui) {
                var index = ui.item.index();
                console.log("Moved to new position: " + index);
                var children = $('ul.tree-list').children()
                // What to do here
           
            })
     
            $( ".tree-list" ).disableSelection();
        });

动态创建数组:

someFunc(data){
    let htmlString= " <ul class =\"tree-list\" "
    for (let i=0; i<data.length; i++){
        if(typeof(item) === "string"){
          htmlString += "<li class=\" li_class \"" + item + "\">";
                                     }
        else if(typeof(item) === "object"){
          htmlString += "<li>";
          htmlString += "span class=\"span_class\""  
                                     }
           htmlString += "</li>"
                                   }
       }
htmlString += "</ul>";
return (htmlString);

}

【问题讨论】:

  • lispan 元素是从数组中创建的吗?如果是这样,您可以通过将对象添加到元素的元数据并简单地使用 map() 在每次排序操作发生时以正确的顺序重新构建数组来简化逻辑。
  • 是的,它们是动态创建的。更新了代码,请看一下。

标签: javascript html jquery jquery-ui jquery-ui-sortable


【解决方案1】:

我尝试使用初始数组重新创建您的示例:

我所做的是,首先创建 data-previndex 以使用 start srotable 将先前的索引存储在 li 位置更新上:(归功于 answer

然后每次更新,调用array_move(归功于此answer)更新js数组上的元素,具体取决于先前和当前索引

请参阅下面的工作 sn-p :

$(function() {
  let arr = [{name:1,data:"xyz"}, {name:2,data:"abc"}, {name:3, data:"lmn"}, {name:4,data:"opq"}, {name:5,data:"stu"}]
  
  let $treeList = $(".tree-list");
  
  arr.forEach(element => {
    let liNode = `<li class="li_class"><span class="span_class"> ${element.name} </span></li>`
    $treeList.append(liNode);
  })
   
  var data = $(".tree-list").sortable({
    delay: 150,
    axis: "y",
    start: function(e, ui) {
        // creates a temporary attribute on the element with the old index
        // credits to this answer https://stackoverflow.com/questions/1601827/jquery-ui-sortable-how-to-determine-current-location-and-new-location-in-update
        $(this).attr('data-previndex', ui.item.index());
    },

    update: function(event, ui) {
      var newIndex = ui.item.index();
      var oldIndex = $(this).attr('data-previndex');
      
      
      var children = $('ul.tree-list').children()
      // What to do here
      arr = array_move(arr, oldIndex, newIndex);
      console.clear()
      console.log(JSON.stringify(arr));
    }
  });

  $(".tree-list").disableSelection();
});

function array_move(arr, old_index, new_index) {
    if (new_index >= arr.length) {
        var k = new_index - arr.length + 1;
        while (k--) {
            arr.push(undefined);
        }
    }
    arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
    return arr; 
};
@import url("https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script>
<ul class="tree-list">
</ul>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 2018-02-18
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多