我有一个包含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次排序时,排序结果更为尴尬总是在上升。
我怎样才能做到这一点?
答案 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' ]] );
}
});
}