jquery ui可排序列表不跟踪列表项属性的更新

jquery ui可排序列表不跟踪列表项属性的更新,jquery,ajax,jquery-ui-sortable,Jquery,Ajax,Jquery Ui Sortable,我正在处理一个列表,它的项既可以选择(使用复选框)也可以排序(使用jquery'sortable') 列表如下所示: <ul id="dragdrop"> <li id="1290"><input type="checkbox" id="290" checked class="slideToggle" /><img ... /></li> <li id="1291"><input type="check

我正在处理一个列表,它的项既可以选择(使用复选框)也可以排序(使用jquery'sortable')

列表如下所示:

<ul id="dragdrop">
    <li id="1290"><input type="checkbox" id="290" checked class="slideToggle" /><img ... /></li>
    <li id="1291"><input type="checkbox" id="291" checked class="slideToggle" /><img ... /></li>
</ul>
$(".slideToggle").click(function () {
    var slideId = $(this).attr("id");
    var checked = $(this).attr("checked");
    if (slideId) { 
        $.post("ToggleInclusion", { "slideId": slideId, "isChecked": checked },
            function () {
                var newId = checked ? "1" : "0" + slideId;
                $(this).parent().attr("id", newId);
            });
    }
});

$("#dragdrop").sortable({
    update: function() {
        var order = $(this).sortable("toArray").toString();
        $.post("UpdateOrder", { "order": order }, function () { });
    }
});
因此,当用户取消选中第二项(id=291)的复选框时,其列表项将更改为

<li id="0291" ... ></li>
  • 我遇到的问题是,这个更改没有被可排序列表捕获。如果取消选中第二个项目,然后将其拖到第一个项目之前的位置,则发送到服务器的订单字符串应为“02911290”,而其应为“12911290”

    我试过在切换回调结束时和可排序更新帖子之前调用
    $(“#dragdrop”).sortable(“refresh”)
    和朋友,但没有骰子

    有什么想法吗

    不要使用“更新”事件,而是尝试使用“停止”并连接您自己的排序变量

    $("#dragdrop").sortable({
      stop: function() {
        var order = "";
        $("#dragdrop").find("tr").each(function() {
            order = order + $(this).attr("id") + ",";
        });
        if(order.length > 0) order = order.substr(0, order.length - 1); // remove the last comma
        $.post("UpdateOrder", { "order": order }, function () { });
      }
    });
    

    希望这对你有用

    因此,解决方案是根本不必考虑可排序的方法——只需直接从复选框中获取所需的属性:

    $(".slideToggle").click(function () {
        var slideId = $(this).attr("id");
        var checked = $(this).attr("checked");
        if (slideId) { 
            $.post("ToggleInclusion", { "slideId": slideId, "isChecked": checked },
                function () { });
        }
    });
    
    $("#dragdrop").sortable({
        update: function() {
            var order = $(".slideToggle").map(function() {
                return ($(this).attr("checked") ? "1" : "0" + $(this).attr("id");
            }).get().join(",");
            $.post("UpdateOrder", { "order": order }, function () { });
        }
    });
    

    谢谢,但不幸的是那不行。停止事件的使用和手动连接都不会捕获更新的id属性。我真的很惊讶做
    $('dragdrop li')。每个(…
    没有选择正确的id值。我想我遗漏了一些更基本的东西,比如可能只有当页面加载时列表项的属性才会被缓存,因此在加载之后无法更新?当我取消选中某些框并刷新页面,然后重新排序时,更新的属性会被删除你捡起来很好。