ajax,jquery可排序,订单更新

时间:2017-05-22 00:36:58

标签: jquery ajax jquery-ui-sortable

我想要实现的是通过更改概述中的“order”输入值(每行都有自己的输入)来更新数据库中幻灯片的顺序, 或者通过拖动行。

所以我首先修复了这个输入,并将ajax请求放在一个函数中。此函数需要行本身和新的订单值,请参阅ajax_order(row,newval);.

然后我将行排序并添加了更新:函数:

$( ".rows-container" ).sortable();

$(".rows-container").sortable({
    update: function( ) {
        $('.rows-container').children().each(function(i, el){
            ajax_order($(this), i + 1);
            $(this).find('.overview-number').val(i+1);
        });
    }
});

现在我循环遍历行,并使用索引作为新的订单号。它工作正常,但每次拖动1行时,它都会更新所有行..即使一行仍然保持原位。

如果保存了30张幻灯片(其中一对可能被标记为非活动状态),它可能无法真正有效。有什么好办法呢?满意的一些提示

更新

当我将这个添加到函数中时,它在我开始拖动时给出了当前(旧)顺序,还有1个额外的console.log'undefined'..所以现在我有5个console.logs而且只有4个实际行。如果我们不需要跟踪旧订单或使用start,那将是一件好事:

start: function(event, ui) {
    $('.rows-container').children().each(function(i, el){
        console.log($(this).find('.overview-number').val());
    });

},

更新

所以我整晚都在困扰xD zzzZZzz。一直在添加php函数并再次删除,添加JS对象存储旧顺序+索引和shit ..tried与不同类型的数组在start:和stop:

它有一个很大的混乱,所以我决定在纸上写下一些场景......并且想出一个好的方法是跟踪最后使用的“订单”。结果如下

$( ".rows-container" ).sortable();

$(".rows-container").sortable({

    update: function() {

        var last_val = 0;//used to compare with the next row and determine it's value
        //if the next row has lower value as the one before, it needs to become higher value
       //note that the view always gets loaded on order ASC 

        $('.rows-container').children().each(function(i){

            //the current row's order
            var current = parseInt($(this).find('.overview-number').val());

            if(i == 0 || current > last_val){ 

                if(current < last_val+5){ //row doesnt need update, yee!!!!
                    last_val = current;

                //makes sure the values dont add up too much, when the difference gets too big
                }else{
                    current = last_val+1;
                    ajax_order($(this), current);
                    $(this).find('.overview-number').val(current);
                    last_val = current;
                }

            //if the next row has lower value as the one before, it needs to become higher value
            }else if(current <= last_val){
                current = last_val+1;
                ajax_order($(this), current);
                $(this).find('.overview-number').val(current);
                last_val = current;
            }
        });
    },
});

像火车一样运行......但正如你所看到的,那里有一些重复,运行ajax的部分。我试图将它放入该对象的函数中并保持'last_value'和'current'可用,但是还没有成功。

1 个答案:

答案 0 :(得分:1)

您可以将开始和结束位置传递给后端服务,然后在服务器上调整该范围内的记录。这样会更有效:

<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.12.4.js"></script>
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<ul id="sortable">
  <li id="itm1">Item 1</li>
  <li id="itm2">Item 2</li>
  <li id="itm3">Item 3</li>
  <li id="itm4">Item 4</li>
  <li id="itm5">Item 5</li>
</ul>
profile