使用fnPreDrawCallback进行动态多列排序

时间:2015-03-17 17:41:15

标签: 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"]);
    }
}

这段代码看起来不错,但是,例如,当我对第1列进行排序时,第3列没有排序,而且当我尝试在第1列第2次排序时,排序结果更为尴尬总是在上升。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

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

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

我建议您从第th个元素的click事件中手动调用fnSort。为此,您必须取消绑定数据表安装的click事件。

创建一个这样的函数并从fnInitComplete中调用它,这样它只能在设置数据表之后运行。

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' ]] );                              
        }
     });     
 }