如何使用Jquery Datatable仅对当前页面进行排序

ssi*_*777 5 sorting jquery jquery-plugins jquery-datatables

我一直在为许多项目使用Jquery数据表,它适用于所有场景.

对于我当前的项目,我要求仅对当前页面进行排序,但默认情况下,datatable将对整个数据进行排序并重绘整个表.

我确信会有一些简单的配置来启用此功能,但除了这些来自论坛的行之外无法找到

var table = $('#example').DataTable();

// Sort by column 1 and then re-draw
table
    .order( [[ 1, 'asc' ]] )
    .draw( false ); 
Run Code Online (Sandbox Code Playgroud)

我试过这个,但似乎没有任何效果.任何人都已成功实现此功能,请分享您的代码.

rtr*_*szk 8

在询问如何仅对当前页面进行排序之前,我们应回答以下问题:

  • 为什么我们要做这样的排序?
  • 我们应该这样做吗?
  • 它有什么意义吗?
  • 这种决定有什么影响?

当我们想要执行查询并显示我们正在处理的结果列表时:

  • 搜索标准
  • 分拣标准
  • 分页

这三个元素密切相关,它们清楚地定义了用户在屏幕上看到的内容.
我们可以举例如下:

有一个演员名单.它按名称排序并分为页面(每页50个项目).我们在第三页.

当我们有这样的规则时,用户在此列表中具有良好的方向.他认为Michael Caine位于顶部,而Shon Connery位于页面底部.当他想找到罗伯特杜瓦尔时,他知道他应该进一步走几页.当他想看到按年龄排序的这些演员时,他只需对列表进行调整并返回到第一页.

但是,如果我们仅为当前页面提供额外的排序呢?这会扰乱上述系统的凝聚力.如果我们对用户说:

您现在看到按年龄分列的按名称排序的演员列表的第三页(页面).

这个用户只能通过当前页面获得什么?名称以"C"开头的演员的年龄层次结构?在页面顶部将有来自此页面的最老的演员.但是用户不知道它是否是所有列表中最老的演员.如果没有,那么他应该在哪个页面寻找旧的?这种求助是毫无价值的,它会覆盖初始排序(具有一定的价值).

这种求助也会导致用户严重混淆.他可以放弃他对原始排序和页面排序的定位.

结论:

我没有看到为单页提供排序的任何意义.我发现它有害.因此,只有在你有强有力的论据时才应该使用它.


JSu*_*uar 5

更新1

虽然我同意rtruszk,但我仍然认为如果你没有选择或1)你的客户不愿意讨论用户体验的变化,应该找到/探索解决方案.

工作示例: http ://jsfiddle.net/ebRXw/63/

通过从DataTable中过滤掉当前可见的行,我能够完成您所追求的目标.我尽力在DataTables中找到一个解决方案,其中一个可能存在,但最后我使用jQuery和哈希表来识别和过滤掉当前可见的行.

我相信这可以进一步优化.希望它能让你朝着正确的方向前进.

$(document).ready(function () {

    var table = $('#example').DataTable({
        "columnDefs": [{
            "targets": [0],
                "visible": false,
                "searchable": true
        }]
    });

    // Show page 0
    table.page(0).draw(false);
    // Sort by column 1 (Name)
    table.order([1, 'asc']).draw(false);

    $("#ReloadTable").click(function () {
        // Clear the current filter
        oTable = $('#example').dataTable();
        oTable.fnFilter('', 0);
        oTable.fnFilter('');

        // Reset all "visible" values in the first cell
        var table = $('#example').DataTable();
        table.rows().indexes().each(function (idx) {
            var d = table.row(idx).data();
            table.row(idx).data()[0] = 0;
            d.counter++;
            table.row(idx).data(d);
        });
    });

    $("#FilterCurrentPage").click(function () {
        // Create a hash of the index of currently visible rows
        var h = new Object();
        var x = $('.odd,.even').filter(function () {
            var idx = $(this)[0]._DT_RowIndex;
            h[idx] = idx;
            return this.style.display == ''
        });

        // update the first value based on the currently visible rows
        var table = $('#example').DataTable();
        table.rows().indexes().each(function (idx) {
            var d = table.row(idx).data();
            if (h.hasOwnProperty(idx)) {
                table.row(idx).data()[0] = 1;
            }
            d.counter++;
            table.row(idx).data(d);
        });

        // filter rows with a value of 1 in the first cell
        oTable = $('#example').dataTable();
        oTable.fnFilter(1, 0);
    });
});
Run Code Online (Sandbox Code Playgroud)

更新0

我还没有找到解决方法,但我确信存在一个.下面的代码将选择并返回数据表中当前可见的行.

var x = $('.odd,.even').filter(function () {
    $(this).addClass('selected'); // Select the visible rows
    return this.style.display == '' 
});
Run Code Online (Sandbox Code Playgroud)

来自DataTables维护者:

有没有一种简单的方法可以告诉数据表我想要排序并仅重绘当前的分页?

在DataTables 1.9-不,没有办法,但在1.10你可以使用table.order(...).draw(false); 保留分页.1.10 pre beta在git中可用,如果你想给它一个bash :-)

艾伦

通过数据表:仅排序表的当前分页

但是,您可能能够获取当前可见的行,对它们进行排序,并以某种方式显示它们.以下代码提供过滤后的当前可见行.

var table = $('#example').DataTable();
table.$('tr', {"filter":"applied"});
Run Code Online (Sandbox Code Playgroud)

也可以看看: