2012-05-25 100 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