首页 文章

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

提问于
浏览
0

我有一个数据表,其中'date'列的类型为String . 现在,当我想按它排序时,它就是's obviously not sorting properly for obvious reasons, so I changed the sType to ' date',一切都很好 .
然而问题是当我将sType从字符串更改为其他内容时,我无法按此列排序 . 页面加载后的初始排序是好的,但我可以't click the column anymore to sort by it. It behaves like bSortable is false, but it isn' t(调试它) . bSort也是如此 .
此外,我已经尝试实现自定义比较器,包括排序插件等相同的结果 .
可能导致问题的任何想法?

EDIT
我的datatable init进程:

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

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

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

1 回答

  • 2

    您的日期格式与 new Date()Data.parse() 不兼容,这就是当您尝试将默认 date 类型应用于列时,列排序变为"frozen"的原因 . 它试图对一堆 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() .

    演示 - > http://jsfiddle.net/nm261eyn/

    这个排序插件应该适用于所有版本的dataTables . 用它作为

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

    TODO :错误处理,检查日期是否符合要求,检查它是否为空字符串 "" 等 . 该插件盲目地假设日期以字符串形式出现,具体格式为 dd.mm.yyyy hh:mm:ss .

    测试表:

    <tbody>
        <tr><td>17.11.2014 21:54:39</td></tr>
        <tr><td>18.11.2013 21:54:39</td></tr>
        <tr><td>17.11.2014 1:54:39</td></tr>        
        <tr><td>17.11.2014 1:54:38</td></tr>                
        <tr><td>16.11.2014 22:54:39</td></tr>        
        <tr><td>16.11.2015 00:00:00</td></tr>                
    </tbody>
    

相关问题