我需要在帐户交易表上设置多列排序。我决定使用jQuery DataTables。每当我单击一个列标题对该列进行排序时(比如列x),我希望它按列3对列x中的任何匹配进行排序。如果我单击第3列,那么当第3列中存在匹配时,它应按列0排序。
我见过fnSortListener和fnSort,看起来我可以通过将它们附加到每一列来实现我的目标......但这似乎真的是多余的,因为每一列都需要这样做第3列的二级排序,第3列除外。
那么,有没有办法让DataTables始终对第3列进行二次排序,然后为第3列指定例外?
感谢任何帮助。我对这个插件很新。谢谢!
修改
这就是我最后的结果。第一个2D数组指示如何在第一次单击时排序,第二个2D阵列指示如何在第二次单击时排序。
var Sorter = function($dataTable) {
return {
bindMultiSort: function(headerSelector, firstOrderTuples, secondOrderTuples) {
var order = 0;
this.removeSorting(headerSelector).click(function() {
if (order === 0) {
$dataTable.fnSort(firstOrderTuples);
order = 1;
} else {
$dataTable.fnSort(secondOrderTuples);
order = 0;
}
});
},
removeSorting: function(headerSelector) {
var $header = $(headerSelector);
$header.unbind('click');
return $header;
}
};
};
function attachSecondarySorting($transactionsTable) {
var sorter = new Sorter($transactionsTable);
sorter.bindMultiSort('#posted', [[POSTED_DATE_COL, "asc"], [DESCRIPTION_COL, "asc"]], [[POSTED_DATE_COL, "desc"], [DESCRIPTION_COL, "asc"]]);
sorter.bindMultiSort('#received', [[RECEIVED_DATE_COL, 'asc'], [DESCRIPTION_COL, 'asc']], [[RECEIVED_DATE_COL, 'desc'], [DESCRIPTION_COL, 'asc']]);
sorter.bindMultiSort('#category', [[TRANSACTION_TYPE_COL, 'asc'], [POSTED_DATE_COL, 'desc'], [DESCRIPTION_COL, 'asc']], [[TRANSACTION_TYPE_COL, 'desc'],
sorter.bindMultiSort('#description', [[DESCRIPTION_COL, 'asc'], [POSTED_DATE_COL, 'desc']], [[DESCRIPTION_COL, 'desc'], [POSTED_DATE_COL, 'desc']]);
sorter.bindMultiSort('#moneyIn', [[MONEY_IN_COL, 'asc'], [DESCRIPTION_COL, 'asc']], [[MONEY_IN_COL, 'desc'], [DESCRIPTION_COL, 'asc']]);
sorter.bindMultiSort('#moneyOut', [[MONEY_OUT_COL, 'asc'], [DESCRIPTION_COL, 'asc']], [[MONEY_OUT_COL, 'desc'], [DESCRIPTION_COL, 'asc']]);
}
答案 0 :(得分:1)
虽然我认为您可以使用aDataSort
和asSorting
列属性的组合来完成您尝试执行的操作,但它们确实存在冗余,并且可能无法提供您需要的完全控制权。
最不冗余的解决方案将类似于以下代码:
var theDataTable = $('#tableId').dataTable(); // with whatever options needed, of course
// unbind the default click event that is in place for sorting
// and replace it with your own calls to fnSort
$('#tableId thead th').unbind('click').click(function(){
var aaSorting = oTable.fnSettings().aaSorting;
var currentSortColumnIndex = aaSorting[0][0];
var currentSortDirection = aaSorting[0][1];
var clickedSortColumnIndex = $(this).index();
var newSortDirection = 'asc';
if(currentSortColumnIndex == clickedSortColumnIndex) {
newSortDirection = (currentSortDirection == 'asc') ? 'desc' : 'asc';
}
if(clickedSortColumnIndex == 3) {
oTable.fnSort( [ [3, newSortDirection], [0, newSortDirection] ] );
}
else {
oTable.fnSort( [ [clickedSortColumnIndex, newSortDirection], [3, newSortDirection] ] );
}
});
如果我正确地解释了您的排序意图,那么这应该可以解决问题,但如果没有,我认为这将为您提供所需的解决方案。
注意:另请参阅标题为datatables.net
的"Sorting on multiple columns"上的论坛讨论