2015-04-13 2 views
0

У меня есть данные с столбцом 'date' типа String. Теперь, когда я хочу сортировать его, он явно не сортируется по понятным причинам, поэтому я изменил sType на «дату», и все в порядке.
Проблема, однако, когда я изменяю sType из строки на что-то еще, я больше не могу сортировать по этому столбцу. Начальная сортировка после загрузки страницы сортируется и выполняется нормально, но я не могу больше щелкнуть по столбцу, чтобы отсортировать ее. Он ведет себя так же, как bSortable - false, но это не (отлаживается). bSort также верна.
Кроме того, я пробовал реализовать пользовательские компараторы, в том числе сортировать плагины и т. Д., То же самое.
Любые идеи, которые могут вызывать проблему?Datatables - Не удается сортировать по столбцу, отличному от типа строки

EDIT:
Мой DataTable процесс инициализации:

$('#scanDataTable').dataTable({ 
    "bJQueryUI": true, 
    "sPaginationType": "full_numbers", 
    "sDom": '<""l>t<"F"fp>', 
    "aaSorting": [[0, "asc"]], 
    "iDisplayLength": "100", 
    "aoColumnDefs": [ 
      {"sType": "date", "aTargets": [0]} 
    ] 
}); 

Если параметр «тампон» является строкой, нажав на коммутаторах заголовков столбцов между возрастанию и по алфавиту сортировки (но это строка, так что сортировка неправильно). После переключения «sType» на дату или что-то еще, кроме строки, щелчок по заголовку таблицы ничего не делает.
Как я упоминал ранее, я попытался использовать «bSortable»: true в параметрах столбца 0 и «bSort»: true в параметрах dataTable и импортированных настраиваемых плагинах сортировки, но это ничего не меняет. Мой формат даты: 17.11.2014 21:54:39.

Важно: После беспорядка с aaSorting я заметил, что сортировка по возрастанию и убыванию одинакова, что, вероятно, означает, что сама сортировка является проблемой, а не параметрами таблицы.

+1

«_Any идей, что может быть причиной проблемы _?» Это невозможно сказать, когда мы не имеем никакого кода, чтобы посмотреть :) Пожалуйста, добавьте свой сценарий и пример разметки вопрос. – davidkonrad

+0

У меня не было никакого кода, потому что на самом деле ничего особенного не показывать.Это просто простой простейший, но достаточно справедливый. Когда я вернусь домой, я добавлю код. – Sikor

+0

Добавлена ​​дополнительная информация вместе с параметрами dataTable. – Sikor

ответ

1

Ваш формат даты не совместим с new Date() или Data.parse(), поэтому сортировка столбцов становится «замороженной» при попытке применить по умолчанию тип date к столбцу. Он пытается сортировать кучу строк NaN. Поэтому вы должны создать соответствующий плагин самостоятельно.

Вот пример, sikor-date, который анализирует ваш формат dd.mm.yyyy hh:mm:ss к стандартному времени UTC:

jQuery.extend(jQuery.fn.dataTableExt.oSort, { 
    "sikor-date-pre": function(a) { 
     var dateParts = a.split('.'), 
     time = a.split(' ')[1].split(':'), 
     year = parseInt(dateParts[2])-1900, 
     month = parseInt(dateParts[1])-1, 
     day = parseInt(dateParts[0]), 
     hours = parseInt(time[0]), 
     mins = parseInt(time[1]), 
     secs = parseInt(time[2]); 
     return Date.UTC(year, month, day, hours, mins, secs); 
    }, 
    "sikor-date-asc": function(a, b) { 
     return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 
    }, 
    "sikor-date-desc": function(a,b) { 
     return ((a < b) ? 1 : ((a > b) ? -1 : 0)); 
    } 
}); 

Вся строка даты разбивается на логические части, разбираемых в целые числа, а затем преобразуется в compareable числа с Date.UTC() ,

демо ->http://jsfiddle.net/nm261eyn/

Эта сортировка плагин должен работать со всеми версиями DataTables. Используйте его как

"aoColumnDefs": [ 
    {"sType": "sikor-date", "aTargets": [0]} 
] 

TODO: Errorhandling, проверьте даты отвечают требованиям, проверьте, если это пустая строка "" и т.д. Плагин слепо предполагает, что даты поставляется в виде строки в точном формате dd.mm.yyyy hh:mm:ss.

Тест стол:

<tbody> 
    <tr><td>17.11.2014 21:54:39</td></tr> 
    <tr><td>18.11.2013 21:54:39</td></tr> 
    <tr><td>17.11.2014 1:54:39</td></tr>   
    <tr><td>17.11.2014 1:54:38</td></tr>     
    <tr><td>16.11.2014 22:54:39</td></tr>   
    <tr><td>16.11.2015 00:00:00</td></tr>     
</tbody> 
+0

Я думал, что этот формат может быть несовместимым, поэтому я загрузил плагин, который теоретически поддерживает несколько новых форматов даты, но после установки sType для этого типа плагина ничего не изменилось. После решения вашего решения, я предполагаю, что он не поддерживает формат даты, который я использую. Спасибо за ваше время, это решило мою проблему. Приветствия. – Sikor

+0

Также изменилась датаParts = a.split ('.') На dateParts = a.split ('') [0] .split ('.') И удалена -1900 в переменной года. Не могли бы вы объяснить, что было с этим -1900? Заранее спасибо. – Sikor

+0

Эй, @ Сикор, добро пожаловать, спасибо за принятие ответа! Нажмите на ссылку выше «Date.UTC()» - год должен быть «_A год после 1900_». Это просто для вычисления правильной в ту же дату, что и целочисленное значение. Сортировка, конечно же, будет работать в любом случае, поскольку между годами нет разницы между 3913 и 3914 годом по сравнению с 2013 и 2014 годами. – davidkonrad