jQuery DataTables列无法正确排序

4
我认为我知道这个问题出在哪里,但是我不知道如何适当地解决它,所以我希望这里有人遇到过类似的问题,并设法修复它。我有一个表格,其中有几列,除了一列之外,所有列都按排序方式工作。下面是该列及其排序工作的屏幕截图。
如您所见,它不按字母数字逻辑进行排序。我的假设是,一些名称中有逗号、括号、方括号等字符。那么,我该如何解决这个问题,以便使用datatables插件对其进行字母数字排序?有什么想法吗?
****编辑****
这是我正在使用的代码,对于除此列之外的所有内容都有效。
jQuery.fn.dataTableExt.oSort['num-asc']  = function(a,b) {
    var x = a.replace( /<.*?>/g, "" );
    var y = b.replace( /<.*?>/g, "" );
    x = parseFloat( x );
    y = parseFloat( y );
    return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['num-desc'] = function(a,b) {
    var x = a.replace( /<.*?>/g, "" );
    var y = b.replace( /<.*?>/g, "" );
    x = parseFloat( x );
    y = parseFloat( y );
    return ((x < y) ?  1 : ((x > y) ? -1 : 0));
};

$(document).ready(function() {
    $('#ledger').dataTable({
        bAutoWidth: false,
        bJQueryUI : true,
        bProcessing: true,
        bServerSide: false,
        sPaginationType: "full_numbers",
        bStateSave : false,
        bUseRendered: false,
        iDisplayLength: ${entriesValue},
        sDom: mw.superadmin.datatable.relatedListDom,
        aLengthMenu: mw.superadmin.datatable.relatedListLengthMenu,
        aaSorting: [[0,'asc']],
        aoColumns: [
            null,
            { "iDataSort": 2},
            { "bVisible": false, "sType": "num"},
            { "iDataSort": 4, "bSortable": true },
            { "bVisible": false, "sType": "num"}
        ]
    });
4个回答

3

看到你展示了一个链接,我猜测你正在使用自定义渲染函数?

如果是这样,在您的列定义中设置以下内容:

"bUseRendered": false

那样会使得表格按照数据排序,而不是渲染后的输出。

这没有什么区别。 - chris
你在列定义中使用它了吗?在你的例子中,它在数据表定义中,那是错误的位置。 - Mike Robinson
很抱歉,我对datatables的工作经验非常有限,而且它基本上是被强制要求与之一起工作的。如果我的代码有助于解决问题,我已将其放在上面了。 - chris
1
我忘记提到这只是在Chrome浏览器上出现问题,FF、IE、Safari和Opera都没问题。这是Chrome特有的问题。 - chris

3

我认为最好的方法是使用aoColumnDefs。请尝试以下内容:

"aoColumnDefs": [
   {
   "sType": "string"
   }
]


如果这样不起作用,您可能需要创建一个自定义排序函数。请参见此链接


很遗憾,那并没有帮助。 - chris
也许尝试在aoColumns的第一列中添加一个字符串类型的sType。使用{"sType": "string"}代替null。此外,您可能需要查看一些关于iDataSort的文档(http://www.datatables.net/ref#iDataSort),因为您隐藏了用于排序的列。 - deusxmach1na
我忘了提到这似乎只是Chrome浏览器的问题,FF,IE,Safari和Opera都没有问题。这是Chrome特有的问题。 - chris

0
如果您正在使用自定义渲染方法,请使用"type"的值来区分实际数据和您的自定义视图。就像下面这样,
"render": function ( data, type, full, meta ) {
    if ( type === 'display' ) {
        return '<a class="btn btn-link">' + full['description'] + '</a>';                       
    }
    return full['description'];
}

在生成视图以及进行排序、搜索等操作时,数据表内部将传递类型为“display”的值以及其他数值。


0
在我的情况下,我的第一列包含图像,我发现对该列进行排序会正确地对第二列进行排序,但是当我点击对第二列进行排序时,它会错误地进行排序。我通过使用“aTargets”禁用第一列并将“sType”设置为“null”来解决这个问题:
    "aoColumnDefs": [
        { 'bSortable': true, 'sType':"null", 'aTargets': [1, 6] },
    ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接