有没有jQuery UI"反排序"那将让李从UL获得,但始终指定顺序?

时间:2017-09-22 16:47:14

标签: javascript jquery user-interface jquery-ui design-patterns

我有两个部分工作的地方有两个UL,它们都有jQuery UI .sortable()。用户可以并且可能应该将LI从一个丢弃到另一个。我希望第二个列表真的可以排序,但是第一个列表保留了一个排序,而不是如果用户点击它,则从末尾附加的第二个列表中获得LI。

我看到一种非常明显的方法:保留LI的值的JavaScript列表,或者交替设置data-index='0'(然后,1,2,3等),然后在任何一种情况下,都可以对恐惧气泡进行单一的,可能是自下而上的扫描。

在我看来,我可以直接开始工作,但它有一个" 如果您这样做,那么你的工作太低了 "代码味道给我。除了冒泡排序参考之外,在我认为O(n)确实可以容忍的情况下,似乎知道jQuery UI的人可以产生更短更清晰的实现。

我已经概述了解决问题的难点。我应该考虑哪些简单的方法。

1 个答案:

答案 0 :(得分:1)

稍微犹豫了一下之后,我决定采用明显的解决方案,即使它没有像通常的jQuery最佳解决方案那样闻起来。我在生成它们的服务器端代码中向原始LI添加了一个升序整数data-字段,并且客户端创建了一个单独的冒泡排序迭代函数,如果除了最后一个项目之外都应该有效(重新添加项目)从最后开始)是有序的:

var get_index = function(node)
    {
    return parseInt(jQuery(node).attr('data-sort-position'));
    };
var sort_available = function()
    {
    var len = jQuery('#available > li').length;
    if (len >= 2)
        {
        var moved = false;
        for(var index = 0; index < len; index += 1)
            {
            if (!moved)
                {
                if (get_index(jQuery('#available > li')[index]) >
                  get_index(jQuery('#available > li')[len - 1]))
                    {
                    var node = jQuery(
                      jQuery('#available > li')[len - 1]).detach();
                    jQuery(node).insertBefore(
                      jQuery('#available > li')[index]);
                    moved = true;
                    }
                }
            }
        }
    };

然后我在处理程序的末尾添加了sort_available()调用,当单击另一个目标列表的成员时调用该句柄:

    jQuery('#included li').click(function(event)
        {
        jQuery(event.target).detach();
        jQuery('#available').append(event.target);
        assign_clicks();
        sort_available();
        });

现在它似乎把物品放回原来的位置。