Sorting 使用FNPREDRAW回调的动态多列排序

Sorting 使用FNPREDRAW回调的动态多列排序,sorting,datatables,multiple-columns,Sorting,Datatables,Multiple Columns,我有一个有3列的表,当我对第1列或第2列进行排序时,我想对第3列进行降序排序 我正在使用fnPreDrawCallback(我也尝试过使用fnDrawCallback) 这是我的密码: "fnPreDrawCallback": function (oSettings) { var column = oSettings.aaSorting[0][0]; if (column !== 3) { oSettings.aaSorting.push([3, "desc"])

我有一个有3列的表,当我对第1列或第2列进行排序时,我想对第3列进行降序排序

我正在使用fnPreDrawCallback(我也尝试过使用fnDrawCallback)

这是我的密码:

"fnPreDrawCallback": function (oSettings) {
    var column = oSettings.aaSorting[0][0];
    if (column !== 3) {
        oSettings.aaSorting.push([3, "desc"]);
    }
}
这段代码看起来不错,但是,例如,当我对列1排序时,列3没有排序,更糟糕的是,当我尝试第二次对列1排序时,排序结果总是递增的

如何实现这一点?

在触发preDrawCallback时,数据已经“排序”,因此在此处更改aaSorting不会更改表的结果

您可以通过检查oSettings进行验证。有aiDisplay和aiDisplayMaster属性。aiDisplay是一个有序的元素数组,当它们通过点击鼠标进行排序时会发生变化。aiDisplayMaster是数据从服务器返回或存在于页面上的原始顺序

我建议从th元素的click事件手动调用fnSort。为此,必须解除datatables安装的click事件的绑定

创建一个类似这样的函数,并从fnInitComplete调用它,这样它只能在设置datatables之后运行

function unbindDTSorting() {
    //unbind sort event, prevent sorting when header is clicked                
    $j('[id$=table] th').unbind('click.DT');

    //create your own click handler for the header
    $j('[id$=table] th').click(function(e) {
        var oTable = $j('[id$=table]').dataTable();
        //here is where you can do all of your if/else logic to create the desired multidimensional sorting
        if(this.cellIndex == 3){
            oTable.fnSort( [ [2, 'asc'],[3,'desc' ]] );                              
        }
     });     
 }