Получение данных строк после фильтрации jQuery Datatables
Кажется, что это должно быть легко, но...
Кто-нибудь знает, как вернуть текущие строки из отфильтрованного dataTable? Метод oTable.fnGetNodes() возвращает все строки , где мне нужны только отфильтрованные (видимые, но включающие разбиение на страницы) строки
// filter on division
var oTable = $('#summary-table').dataTable();
oTable.fnFilter(division_text, 2, true);
// Get the nodes from the table
var nNodes = oTable.fnGetNodes(); // <-- still retrieves original list of rows
Я проверил: извлечение видимых данных из таблиц данных, но это не очень помогает.
7 ответов:
Самый простой способ сделать это на самом деле встроен прямо в DataTables API :
_('tr', {"filter": "applied"})Используется в функции:
function get_filtered_datatable() { var filteredrows = $("#mydatatable").dataTable()._('tr', {"filter": "applied"}); for ( var i = 0; i < filteredrows.length; i++ ) { debug.console(filteredrows[i]); }; }
Начиная с Datatables 1.10, существует встроенный способ получения отфильтрованных или нефильтрованных строк после поиска.
var table = $('#example').DataTable(); table.rows( {search:'applied'} ).nodes(); table.rows( {search:'removed'} ).nodes();Есть и другие варианты получения только текущей страницы или всех страниц, а также порядка. Подробнее здесь: http://datatables.net/reference/type/selector-modifier
Лучше поздно, чем никогда, но я и сам с этим боролся. Вот что я придумал
$.fn.dataTableExt.oApi.fnGetVisibleData = function(){ displayed = []; currentlyDisplayed = this.fnSettings().aiDisplay; //gets displayed rows by their int identifier for (index in currentlyDisplayed){ displayed.push( this.fnGetData( currentlyDisplayed[index] )); } return displayed; }
Придумал ответ, если кому-нибудь это когда-нибудь понадобится:
Во-первых, используя это расширение datatables, чтобы получить все скрытые строки:
$.fn.dataTableExt.oApi.fnGetHiddenTrNodes = function (oSettings, arg1, arg2) { /* Note the use of a DataTables 'private' function thought the 'oApi' object */ var anNodes = this.oApi._fnGetTrNodes(oSettings); var anDisplay = $('tbody tr', oSettings.nTable); /* Remove nodes which are being displayed */ for (var i = 0; i < anDisplay.length; i++) { var iIndex = jQuery.inArray(anDisplay[i], anNodes); if (iIndex != -1) { anNodes.splice(iIndex, 1); } } /* Fire back the array to the caller */ return anNodes; }Затем отфильтруйте скрытые узлы, чтобы получить только видимые узлы:
var rows = oTable.fnGetNodes(); // get all nodes var rows_hidden = oTable.fnGetHiddenTrNodes(); // get all hidden nodes var result = [], found; // remove hidden nodes from all nodes for (var i = 0; i < rows.length; i++) { found = false; for (var j = 0; j < rows_hidden.length; j++) { if (rows[i] == rows_hidden[j]) { found = true; break; } } if (!found) { result.push(rows[i]); } }
Если вы пытаетесь получить фактические элементы tr DOM вместо данных, решение аналогично предложенным выше решениям подчеркивания, но вместо них используется метод$.
function getFilteredDatatable() { return $("table.dataTable").dataTable().$('tr', { "filter": "applied" }); }Более подробная информация доступна на странице документации API. http://datatables.net/api
Список видимых строк можно получить, изменив функцию fnGetHiddenTrNodes следующим образом.
$.fn.dataTableExt.oApi.fnGetVisibleTrNodes = function (oSettings, arg1, arg2) { /* Note the use of a DataTables 'private' function thought the 'oApi' object */ var anNodes = this.oApi._fnGetTrNodes(oSettings); var anDisplay = $('tbody tr', oSettings.nTable); var visibleNodes = []; for (var i = 0; i < anDisplay.length; i++) { var iIndex = jQuery.inArray(anDisplay[i], anNodes); if (iIndex != -1) { visibleNodes.push(anDisplay[i]); } } /* Fire back the array to the caller */ return visibleNodes; }
Имея настройку таблицы это работало для меня, имея флажок с идентификатором для каждой строки и другой флажок, который будет выбирать все строки либо когда фильтр был применен(только фильтрованные строки), либо нет (все строки)
$(document).ready(function() { var myDataTableHandle = $('#example').dataTable({"bPaginate": false}); $('#selectAllCheckBox').click(function() { if($(this).is(':checked')){ var filteredRows = myDataTableHandle._('tr', {"filter":"applied"}); alert( filteredRows.length +' nodes were returned' ); $(myDataTableHandle.fnGetNodes()).find($('input[name=idCheckBox]')).each(function () { $(this).prop('checked', true); }); else{ $('input[name=idCheckBox]:checked').prop('checked', false); } }); });
Comments