【问题标题】:jQuery DataTables rowReorder issuejQuery DataTables rowReorder 问题
【发布时间】:2016-07-28 14:21:41
【问题描述】:

我正在对静态表(非 AJAX)使用 DataTables 和 rowReorder 插件 - 一切都很好,但是当我拖动一行时,当它在表内移动时,当我放下它时,它会回到原来的位置而不刷新(即它实际上从不移动位置 - 我知道我需要通过 AJAX 更新才能永久移动,但我需要先让它工作!)

我添加了这段代码来尝试告诉我发生了什么:

    table.on('row-reorder', function (e, diff, edit) {
        var result = 'Reorder started on row: '+edit.triggerRow.data()[1]+'<br>';

        for (var i=0, ien=diff.length ; i<ien ; i++) {
            var rowData = table.row( diff[i].node ).data();

            result += rowData[1]+' updated to be in position '+
                diff[i].newData+' (was '+diff[i].oldData+')<br>';
        }

        $('#event-result').html('Event result:<br>'+result);
    }); 

当我使用它时,在事件结果中,我得到类似:

Event result:
Reorder started on row: 3
4 updated to be in position (was )
5 updated to be in position (was )
3 updated to be in position (was )

插件可以看到我正在尝试移动第 3 行,但它似乎无法确定我要删除它的位置,因此新位置和旧位置是空白的,而在 https://datatables.net/extensions/rowreorder/examples/initialisation/events.html 上你可以看到它应该“知道”要放置的位置以及将 2 个相邻列重新排序到的位置。

在我看到的所有示例中,行等中都没有添加 id,所以我假设这是由插件冲突引起的 - 任何人都见过这个并且知道如何修复?

这是我的整个数据表代码:

    $.extend( $.fn.dataTable.defaults, {
        autoWidth: false,
        dom: '<"datatable-header"fBl><"datatable-scroll-wrap"t><"datatable-footer"ip>',
        language: {
            search: '<span></span> _INPUT_',
            lengthMenu: '<span></span> _MENU_',
            paginate: { 'first': 'First', 'last': 'Last', 'next': '&rarr;', 'previous': '&larr;' }
        }
    });                     
   // Column selectors
    var table = $('.datatable-button-html5-columns').DataTable({
        //dom: 'lBfrtip',
        initComplete: function () {
            this.api().columns('.select-filter').every( function () {
                var column = this;
                var select = $('<select class="form-control"><option value=""></option></select>')
                    .appendTo( $(column.footer()).empty() )
                    .on( 'change', function () {
                        var val = $.fn.dataTable.util.escapeRegex(
                            $(this).val()
                        );

                        column
                            .search( val ? '^'+val+'$' : '', true, false )
                            .draw();
                    } );

                column.data().unique().sort().each( function ( d, j ) {
                    select.append( '<option value="'+d+'">'+d+'</option>' )
                } );
            } );
        },
        colReorder: true,
        orderCellsTop: true,
        stateSave: true,
        pageLength: 10,
        order:[[ 1, "asc" ]],
        language: {
            url: "/assets/js/plugins/tables/datatables/lang/en.php"
        },          
        select: true,
        rowReorder: {
            selector: 'tr',
            update: true
        },          
        buttons: {            
            dom: {
                button: {
                    className: 'btn btn-default'
                }
            },
            buttons: [
                {
                    extend: 'colvis',
                    titleAttr: 'Columns'
                },
                {
                    extend: 'copyHtml5',
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'excelHtml5',
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'pdfHtml5',
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'print',
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    text:      '<span id="resetTable">Reset</span>'
                }                   

            ]
        },
        responsive: {
            details: {
                type: 'column',
                target: 'tr'
            }
        },
        columnDefs: [
            {
                className: 'control',
                orderable: true,
                targets:   0
            }
        ]                           
    });

            // Setup event
    table.on('row-reorder', function (e, diff, edit) {
        var result = 'Reorder started on row: '+edit.triggerRow.data()[1]+'<br>';

        for (var i=0, ien=diff.length ; i<ien ; i++) {
            var rowData = table.row( diff[i].node ).data();

            result += rowData[1]+' updated to be in position '+
                diff[i].newData+' (was '+diff[i].oldData+')<br>';
        }

        $('#event-result').html('Event result:<br>'+result);
    });

【问题讨论】:

    标签: jquery datatables


    【解决方案1】:

    在数据表初始化代码中,移除订单属性。如果我们使用顺序,那么拖放将不起作用。

    Example with order - 不工作

    table = $('#ConfigMenuTable').DataTable({
      data: testData,
      "rowReorder":  {
                    selector: 'td:nth-child(1)'
                },            
      "order":[[ 1, "asc" ]],
      "columns": [
                    {"visible": false},                         
                    {"width": "20%", "className": 'reorder'},                       
                    {"visible": false,"searchable": true, "width": "15%"},     
                    {"orderable": false, "searchable": false},  
                    {"orderable": false, "searchable": false},
                    {"orderable": true, "searchable": false}                
                ]
    
    });
    

    Example without order - 工作

    table = $('#ConfigMenuTable').DataTable({
      data: testData,
      "rowReorder":  {
                    selector: 'td:nth-child(1)'
                }, 
      "columns": [
                    {"visible": false},     
                    {"width": "20%", "className": 'reorder'},   
                    {"visible": false,"searchable": true, "width": "15%"},  
                    {"orderable": false, "searchable": false},
                    {"orderable": false, "searchable": false},
                    {"orderable": true, "searchable": false}                
                ]    
    });
    

    【讨论】:

      【解决方案2】:

      尝试将 ID 或序列添加到表中。在basic initialization example 中,它说:

      表中的第一列是序号,为排序提供依据。

      that example它有一个隐藏的序列列:

      columnDefs: [
          { targets: 0, visible: false }
      ]
      

      【讨论】:

        【解决方案3】:

        这是销毁和重置数据表的代码

        if ($.fn.DataTable.isDataTable("#categoryListDataTable"))
        {
            $("#categoryListDataTable").dataTable().fnDestroy();
        }
        
        var table = $('#categoryListDataTable').DataTable( {
            rowReorder: true,
        } );
        
        
        table.on( 'row-reorder', function ( e, diff, edit ) {
            var res = '';
            for ( var i=0, ien=diff.length ; i<ien ; i++ ) {
                res += diff[i].newData+'=';
            }
            res = res.substring(0, res.length - 1);
            getVal(res);
        } );
        

        由于获取值并运行 ajax 以保存在服务器端,因此将其设为另一个函数

        function getVal(res)
        {
            var atmp = res.split('=');
            var newId = '';
            var newArr = [];
            for(var i=0,j=atmp.length;i<j;i++)
            {
                newId = $('#categoryListDataTable').find("tr:eq("+atmp[i]+") input[type='hidden']").val();
                if(newId != '')
                    newArr[atmp[i]] = newId;
            }
        
            var urlStr = '<?php echo base_url('admin/managecategories/reorderCategories');?>';
            $.ajax({
                data:{new_:newArr},
                url:urlStr,
                cache:false,
                method:'POST',
                success:function(data){
                    console.log(data);
                },
                error:function(error){
                    console.log(error);
                }
            });
        }
        

        【讨论】:

        • 希望对您有帮助
        • 欢迎堆栈溢出!您能否为这个答案添加更多描述?最佳答案通常包含描述代码在做什么的文字。
        【解决方案4】:

        这有点过时了,但我必须解决它并认为我会分享我所做的。我的要求是一个包含可排序行的表格,但通过点击标题进行排序不是必需的,这让 UI 有点混乱。

        HTML 是一个相当标准的表格。

        HTML

        <table class="table table-responsive-md table-striped" id="maskEditTable">
        <thead>
            <tr>
                <th>Position</th>
                <th>Valid Characters</th>
                <th>Is&nbsp;Literal&nbsp;Character</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>0</td>
                <td><input type="text" class="form-control" value="123" /></td>
                <td>
                    <label aria-label="Is Character Literal" for="needsAUniqueId"></label>
                    <input type="checkbox" id="needsAUniqueId" />
                </td>
            </tr>
            <tr>
                <td>1</td>
                <td><input type="text" class="form-control" value="456" /></td>
                <td>
                    <label aria-label="Is Character Literal" for="needsAUniqueId"></label>
                    <input type="checkbox" id="needsAUniqueId" />
                </td>
            </tr>
            <tr>
                <td>2</td>
                <td><input type="text" class="form-control" value="789" /></td>
                <td>
                    <label aria-label="Is Character Literal" for="needsAUniqueId"></label>
                    <input type="checkbox" id="needsAUniqueId" />
                </td>
            </tr>
            <tr>
                <td>3</td>
                <td><input type="text" class="form-control" value="abc" /></td>
                <td>
                    <label aria-label="Is Character Literal" for="needsAUniqueId"></label>
                    <input type="checkbox" id="needsAUniqueId" />
                </td>
            </tr>
            <tr>
                <td>4</td>
                <td><input type="text" class="form-control" value="def" /></td>
                <td>
                    <label aria-label="Is Character Literal" for="needsAUniqueId"></label>
                    <input type="checkbox" id="needsAUniqueId" />
                </td>
            </tr>
        </tbody>
        

        javascript 也相当简单。主要区别在于添加了一个绘制事件处理程序。这会迭代标题字段并去除类标签,并删除点击处理程序。此代码是从页面加载处理程序调用的。

        JAVASCRIPT

        function removeSorting() {
            $.each($('#maskEditTable').find('thead > tr > th'), function (i, header) {
                $(header).attr('class', null);
                $(header).off('click');
            });
        }
        function() init(){
            var tab = $('#maskEditTable')
                .DataTable({
                paging: false,
                info: false,
                searching: false,
                rowReorder: {
                    selector: 'tr',
                    update: true
                },
                order: [[0, "asc"]],
                columnDefs: [
                    {
                        targets: 0,
                        visible: true
                    }
                ]
                });
            tab.on('draw.dt', removeSorting);
            removeSorting();
        }
        

        结果正是我所期望的,在我的任何测试中都没有对重绘产生明显的影响。

        GL!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多