【问题标题】:jQuery UI Sortable - how to set data, based on the got datajQuery UI Sortable - 如何根据获取的数据设置数据
【发布时间】:2018-03-01 08:04:23
【问题描述】:

我使用jQuery UI Sortable 让用户对查询的数据进行排序,并将排序后的数据保存到另一个表中。我将更改后的订单放入隐藏字段并保存数据。

HTML

<?php
// $queried_data is queried in LIFO order from a table, suppose an order like: 1,2,3,4
$saved_data = '2,3,4,1'; //queried as a string from another table
?>
<div class="data-sorter">
    <ul id="sortable-data">
    <?php foreach($queried_data as $key => $value) : ?>
        <li id="<?php echo $value->ID; ?>">
            <?php echo $value->title; ?>
        </li>
    <?php endforeach; ?>
    </ul>
    <!-- HIDDEN FIELD: putting saved data here, and updating according to the changed data, and finally saving as a comma-separated string -->
    <input type="hidden" class="data-sorted" value="<?php echo $saved_data; ?>">
</div>

JAVASCRIPTS

jQuery( document ).ready(function($) {
    "use strict";

    var sortable_data = $( "#sortable-data" );

    sortable_data.sortable({
        update: function( event, ui ) {
            var list_id     = this.id,
                item_moved  = ui.item.attr('id'),
                order       = $(this).sortable('toArray'),
                positions   = order.join(',');

            var hidden_field = $('#'+ list_id).parent().find('.data-sorted');

            hidden_field.val(positions).trigger('change');
        }
    });

    sortable_data.disableSelection();

});

但正如您所见,$queried_data$saved_data。因此,在刷新之后,PHP 循环将事情按原样进行。我没关系。我只需要使用可排序的 jQuery UI 操作 DOM,以便它们按照从 $saved_data 获取的顺序显示。

我需要一种方法来触发可排序的 jQuery UI(我在 Javascripts 中的第 6 行中做了)以及根据 $saved_data 设置值(可用作隐藏字段 .data-sorted 的值)。

我知道我需要Sortatble create event,但我不知道该怎么做。

【问题讨论】:

    标签: php jquery jquery-ui-sortable


    【解决方案1】:

    检查这个逻辑,应该可以工作。考虑到 li id 与逗号分隔值相同。

    sortable 调用后的页面加载调用函数reorder()

    $("#sortable-data").sortable({update: reorder});
    function reorder()
    {
        orderArray = $('.data-sorted').val();
        elementContainer = $("#sortable-data")
        $.each(orderArray, function(key, val){
            elementContainer.append($("li#"+val));
        });
    }
    

    【讨论】:

    • 我认为你误会了。 update 事件在用户停止排序并且 DOM 位置发生变化时触发。我需要一个在页面刷新后自动触发的解决方案。
    • 但是在页面刷新时你可以调用这个函数reorder(),在页面刷新之后,在你的sortable调用之后,再次添加类似reorder()这样的语句
    • 谢谢。现在明白了。你误会我的一件事是 $('.data-sorted').val() 不是数组值,它是一个逗号分隔的字符串。我做了orderArray = orderArray.split(','); 使它成为一个数组。并且有未定义的变量错误,所以我将orderArray 更改为var orderArray 等等。您可以为将来需要的人解决问题。拯救了我的一天。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多