2015-02-27 2 views
2

Это мой первый попыток сделать сортировку нескольких столбцов datatables, и мне просто нужна помощь в том, будет ли то, что я указал, будет работать так, как я этого хочу.Datatables multi-column sort - требуется помощь со спецификацией

У меня есть следующая таблица.

enter image description here

То, что я хочу для DataTables до:

  • сортировать по третьей колонке (Conn Status) по алфавиту с его вторичной сортировки приходит после. Если третий столбец сортируется, правила сортировки, указанные для последующих столбцов, не нужно применять.
  • Если третий столбец имеет одинаковые значения, и поэтому сортировка не может быть применена, мне бы хотелось, чтобы он сортировал по столбцу 5 desc (mdi) с последующей вторичной сортировкой. Если пятый столбец сортируется, правила сортировки, указанные для последующих столбцов, не нужно применять.
  • Если пятый столбец имеет одинаковые значения, и поэтому сортировка не может быть применена, я бы хотел, чтобы он сортировал по столбцу 7 (DSM) desc с последующей сортировкой после второго. Если седьмой столбец сортируется, правила сортировки, указанные для последующих столбцов, не нужно применять.
  • Если седьмой столбец имеет все те же значения, и поэтому сортировка не может быть применена, я бы хотел, чтобы он сортировал по столбцу 1 (SiteId) asc.

Это то, что я пытался сделать до сих пор, но мне бы хотелось немного помочь, если это возможно. Кроме того, как я могу указать ДЕСК часть вида (на данный момент я могу только выяснить, по возрастанию.

$("#storeHealthTbl").dataTable ({ 
     "bSort": true, 
     "bLengthChange": false, 
     "bPaginate": false, 
     "aoColumnDefs": [ { 
      "aTargets": [ 2 ], 
      "sType": "string", 
      "aDataSort": [ 2, 4, 6 ] /* Want 2,4,6 to be desc but don't know how*/ 
     }, { 
      "aTargets": [ 4 ], 
      "sType": "string", 
      "aDataSort": [ 4, 6 ] /* Want 4,6 to be desc but don't know how*/ 
     }, { 
      "aTargets": [ 6 ], 
      "sType": "string", 
      "aDataSort": [ 6 ] /* Want 6 to be desc but don't know how*/ 
     }, { 
      "aTargets": [ 0 ], 
      "sType": "numeric", 
      "aDataSort": [ 0 ] /* This one is asc */ 
     }, ] 
    }); 

Следует также отметить, что столбцы с изображениями в них будет иметь алфавитный «X» в определенные моменты времени и, следовательно, это то, как я ожидаю, что сорт будет работать. Если нет «X», и все они являются зелеными изображениями (т. е. не альфа-символом », то я хотел бы перейти к следующему сортировке, указанному мной).

Надеется, что это имеет смысл.

Я использую таблицы 1.9.4 данных.

спасибо

+0

Просто чтобы быть ясно, если столбец 4 имеет различные значения и может быть отсортирован, должны сортировать конец там или должен быть столбец 7 также сортируются? – DelightedD0D

+0

и какая версия DataTables вы используете, поверьте, это важно. – DelightedD0D

+0

Я получу ответ на свою версию через пару часов, а также уточню ваш вопрос. Сидите плотно до тех пор – Richie

ответ

1

Я не мог найти встроенных функций, которые могли бы выполнить этот уровень условной сортировки. Если вы не возражаете использовать программный эквивалент молотка, нижеследующий должен сделать трюк.

Обратите внимание, что у меня могут не быть порядка сортировки для того, что вы хотите, но вы можете изменить это достаточно легко.

Вот working jsfiddle

// function to check our conditions and set the proper sort order 
function getSortOrder(sortCols, sortVars) { 
    var set = false; 
    // loop through our array of columns to check 
    $.each(sortCols, function(ind, elm) { 
     // create a var to hold the value in this column on the first row 
     var firstVal; 
     // loop through each row 
     $("#datatable").find('tr').each(function(tri, tre) { 
      // stop checking if we already found a column with different values 
      if (!set) { 
       // otherwise, et get the value in this column on this row 
       var curCellVal = $(this).find('td').eq(sortCols[ind]).text(); 
       // row 0 is a header row, do nothing 
       if (tri == 0) { 
       } else if (tri == 1) { // for first actual row, set `firstVal` to its value 
        firstVal = curCellVal; 
       } else { // if after first row, check current row's cell value against 'firstVal' 
        // if the values are different, this column can be sorted, 
        if (curCellVal != firstVal) { 
         // flag as set so the function stops looking 
         // this could probably be done better 
         set = true; 
         // initialize datatable with the sort order at the current index of `sortVars` 
         initDTWithSortOrder(sortVars[ind]); 
        } 
       } 
      } 
     }); 
    }); 
    // default initialization if not caught by our function 
    var datatable = set ? null : $("#datatable").dataTable(); 
}; 
// `getSortOrder()` takes two parameters 
// parameter 1: array: columns to check 
// parameter 2: array: sort values (each being a muti-dimensional array: [column, direction]) 
getSortOrder([2, 6, 8, 0], [ 
    [[2, 'desc'],[4, 'desc'],[6, 'desc']], // sort order to use is column 3 is not all the same value 
    [[4, 'desc'],[6, 'desc']],    // sort order to use is column 7 is not all the same value 
    [[8, 'desc']],       // sort order to use is column 9 is not all the same value 
    [[0, 'asc']],       // sort order to use is column 1 is not all the same value 
]); 

function initDTWithSortOrder(sortOrder) { 
    $("#datatable").dataTable({ 
     "bSort": true, 
     "bLengthChange": false, 
     "bPaginate": false, 
     "aaSorting": sortOrder 
    }); 
} 
+0

Спасибо. Это то, что мне нужно. Это отличный учебник для меня и других, чтобы узнать больше о datatables. Но это также помогло мне с каким-то общим jquery knwoledge. – Richie