数据表 - 不能按字符串类型排序

时间:2015-04-13 21:25:12

标签: javascript jquery sorting jquery-datatables

我有一个带有String类型'date'列的数据表。现在,当我想按它排序时,由于显而易见的原因显然没有正确排序,所以我将sType改为'date',一切都很好。
然而问题是,当我将sType从字符串更改为其他内容时,我无法按此列排序。页面加载后的初始排序已排序且正常,但我无法再单击该列以按其排序。它的行为类似于bSortable是假的,但它不是(调试它)。 bSort也是如此。
此外,我尝试过实现自定义比较器,包括排序插件等相同的结果。
可能导致问题的任何想法?

修改
我的数据表初始化过程:

$('#scanDataTable').dataTable({
     "bJQueryUI": true,
     "sPaginationType": "full_numbers",
     "sDom": '<""l>t<"F"fp>',
     "aaSorting": [[0, "asc"]],
     "iDisplayLength": "100",
     "aoColumnDefs": [
          {"sType": "date", "aTargets": [0]}
     ]
});

如果“sType”参数是字符串,则单击列标题会在asc和desc排序之间切换(但它是字符串,因此排序不正确)。将“sType”切换为日期或除字符串以外的任何内容后,单击表格标题不会执行任何操作 正如我之前提到的,我尝试使用“bSortable”:在第0列选项中为true,在“bSort”中为true:在dataTable选项中为true,以及导入的自定义排序插件,但它不会更改任何内容。我的日期格式是:17.11.2014 21:54:39。

重要:在使用aaSorting搞砸之后,我注意到asc和desc排序都是相同的,这可能意味着排序本身就是问题,而不是表格选项。

1 个答案:

答案 0 :(得分:2)

您的日期格式与new Date()Data.parse()不兼容,这就是当您尝试将默认date类型应用于列时,列排序变为“冻结”的原因。它试图对一堆NaN字符串进行排序。所以你必须自己创建一个合适的插件。

以下是一个示例,sikor-date将您的格式dd.mm.yyyy hh:mm:ss解析为标准UTC时间:

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
    "sikor-date-pre": function(a) {
        var dateParts = a.split('.'),
        time = a.split(' ')[1].split(':'),
        year = parseInt(dateParts[2])-1900,
        month = parseInt(dateParts[1])-1,
        day = parseInt(dateParts[0]),
        hours = parseInt(time[0]),
        mins = parseInt(time[1]),
        secs = parseInt(time[2]);
        return Date.UTC(year, month, day, hours, mins, secs);
    },
    "sikor-date-asc": function(a, b) {
        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
    },
    "sikor-date-desc": function(a,b) {
        return ((a < b) ? 1 : ((a > b) ? -1 : 0));
    }
});

将整个日期字符串拆分为逻辑部分,解析为整数,然后使用Date.UTC()转换为可比较的数字。

演示 - &gt;的 http://jsfiddle.net/nm261eyn/

此排序插件应适用于所有版本的dataTables。将其用作

"aoColumnDefs": [
    {"sType": "sikor-date", "aTargets": [0]}
]

TODO :错误处理,检查日期是否符合要求,检查它是否为空字符串""等。插件盲目地假设日期以精确格式的字符串形式出现{ {1}}。

测试表:

dd.mm.yyyy hh:mm:ss