2013-10-03 5 views
2

Я пытаюсь получить jQuery dataTables для сортировки моего числового столбца по пользовательским значениям. Я прочитал все потоки о числовой сортировке, но пока не нашел рабочего решения для своей проблемы. Я храню свои числа в атрибуте данных JQuery называется sort-countjQuery dataTables custom afnSortData function sort numeric

Это моя инициализация DataTables:

$('.wp-list-table').dataTable({ 
    "aoColumns": [ 
     null, 
     null, 
     null, 
     { "sType": "numeric", "sSortDataType": "numeric-data-attribut" }, 
     { "sType": "numeric", "sSortDataType": "numeric-data-attribut" }, 
     { "bSortable": false, "bSearchable": false }, 
    ], 
    "bJQueryUI":true, 
    "bPaginate":true, 
    "sPaginationType":"full_numbers" 
}); 

И это моя пользовательская функция afnSortData поймать значения до сортировки:

jQuery.fn.dataTableExt.afnSortData['numeric-data-attribut'] = function (oSettings, iColumn) 
{ 
    var aData = []; 
    jQuery('td:eq('+iColumn+')', oSettings.oApi._fnGetTrNodes(oSettings)).each(function() { 
     aData.push(parseInt(jQuery(this).attr('data-sort-count'), 10)); 
    }); 

    console.log(aData); 

    return aData; 
}; 

console.log(aData) показывает следующий вывод, когда несколько раз щелкнул по столбцу, чтобы отсортировать его. Как вы можете видеть, он извлекает правильные значения, они все числовые, но они сортируют их полностью случайным образом.

output of console log

Я пытался в течение многих часов, но просто не могу заставить его работать.

ответ

3

... 7 часов спустя ...

Это ошибка, которая возникает при использовании новых версий JQuery с DataTables. По-видимому, возвращенный выбор теперь упорядочен по DOM-событию , а не по порядку элементов в массиве, который больше возвращается функцией _fnGetTrNodes.

Образец для использования пользовательской функции afnSortData в документации dataTables устарел и не работает с более новыми версиями jQuery.

Рабочая версия выглядит следующим образом:

jQuery.fn.dataTableExt.afnSortData['numeric-data-attribut'] = function (oSettings, iColumn) 
{ 
    return jQuery.map(oSettings.oApi._fnGetTrNodes(oSettings), function (tr) { 
     var v = jQuery('td:eq('+iColumn+')', tr); 
     return parseInt(jQuery(v).attr('data-sort-count'), 10); 
    }); 
};