2012-05-25 96 views
3

我需要在帐户事务处理表上设置多列排序。我决定使用jQuery DataTables。每当我点击一个列标题对该列进行排序(比如列x)时,我希望它按列3对列x中的任何匹配进行排序。如果我点击第3列,那么当列3中有匹配项时,它应该按第0列排序。默认次级排序

我见过fnSortListenerfnSort,看起来我可以通过将这些附加到每列来实现我的目标。 。但似乎真是多余,因为每一列需要做的辅助排序列上3,除3列

那么,有没有一种方法来告诉数据表总是在第3栏做了二次排序,然后指定第3列的例外情况?

任何帮助表示赞赏。我对这个插件很陌生。谢谢!

编辑

这里是我结束了去。第一个二维数组指示如何对第一次点击进行排序,第二个二维数组指示如何对第二次点击进行排序。

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

你能澄清你是什么意思时,你说你要一列那里有另一列比赛进行排序?以及点击列中没有匹配项时数据会发生什么? – jimmym715

+0

或者你只是说,单击列x将先按列x然后按列3排序,除了按列3排序然后按列0排序的列3? – jimmym715

+0

另一种方法是让用户控制二次排序。如果他们点击两个不同的列,第一个将是次要的,第二个将是主要的 - 只要您使用* stable *排序。强制使用辅助键可以防止这种情况发生。 –

回答

1

虽然我认为你可以做到你想要什么与aDataSortasSorting列属性的组合做的,他们也有他们的裁员可能无法提供非常需要的控制。

最小冗余的解决方案将是一个,它类似于下面的代码:

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"

+0

换句话说,不,我不能指定一个默认列进行二次排序。游民。我已经实施了类似于您的建议的内容,但必须为表格中的每一列都做到这一点。这正是我想要避免的。我做了一个可重复使用的函数,您可以在每次调用fnSort时传入二维数组,并且每次函数调用时都会运行类似于上述代码的内容。我能做的最好:( – Samo

+0

@Samo,你可以发布该代码吗? – mkoryak

+0

@mkoryak:编辑的问题包括解决方案。 – Samo