2012-05-25 4 views
3

Мне нужно настроить сортировку нескольких столбцов в таблице операций с учетной записью. Я решил пойти с jQuery DataTables. Всякий раз, когда я нажимаю заголовок столбца, чтобы сортировать этот столбец (скажем, столбец x), я хочу, чтобы он сортировал по столбцу 3 для любых совпадений в столбце x. Если я нажму столбец 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

вы можете уточнить, что вы имеете в виду, когда вы говорите, что вы хотите отсортировать по одному столбцу, где результаты в другом столбце? и что происходит с данными, если в столбце нет совпадений? – jimmym715

+0

или вы просто говорите, что щелчок по столбцу x сортирует сначала по столбцу x, а затем по столбцу 3, за исключением столбца 3, который сортирует по столбцу 3, а затем по столбцу 0? – jimmym715

+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"

+0

Другими словами, нет, я не могу указать столбец по умолчанию для вторичной сортировки. Облом. Я уже реализовал нечто похожее на ваше предложение, но должен был сделать это для каждого столбца таблицы. Вот чего я пытался избежать. Я сделал многоразовую функцию, в которой вы передаете 2D-массивы для каждого вызова fnSort, и с каждым вызовом функции выполняется нечто похожее на вышеуказанный код. Лучше всего я могу :( – Samo

+0

@ Само, можете ли вы опубликовать этот код? – mkoryak

+0

@mkoryak: Отредактированный вопрос, чтобы включить решение. – Samo

Смежные вопросы