DataTables поиск содержимого дочерней строки
строка поиска DataTables не позволяет мне искать содержимое в дочерние строки.
я тщательно искал, чтобы найти ответ на этот вопрос (1, 2, 3, 4, 5, 6, 7, 8, 9), но ответов на этот вопрос практически нет.
вот простой jsfiddle и объекты DataTable результаты отладчика.
Я хочу найти в таблице добавочный номер (который находится в дочерней строке), но ввод одного из добавочных номеров в строку поиска не оставляет результатов поиска.
я попробовал решение от этот пост, добавив Это:
table.columns().every( function () {
var that = this;
var header = this.header();
$( 'input', this.footer() ).on( 'keyup change', function () {
that
.column( header.getAttribute('data-search-index')*1 ) // *1 to make it a number
.search( this.value )
.draw();
} );
} );
...но это все еще не работает, как вы можете видеть в jsfiddle, указанному выше.
может кто-то пожалуйста, помогите мне?
спасибо
3 ответов
решение
для jQuery DataTables для поиска дочерних строк вам нужно добавить данные, отображаемые в дочерних строках, в главную таблицу в виде скрытых столбцов.
например, вы можете добавить скрытый столбец extn
свойство данных с помощью columns.visible
параметр, как показано ниже:
JavaScript:
"columns": [
{
"class": 'details-control',
"orderable": false,
"data": null,
"defaultContent": ''
},
{ "data": "name" },
{ "data": "position" },
{ "data": "office" },
{ "data": "salary" },
{ "data": "extn", "visible": false }
],
HTML-код:
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Salary</th>
<th>Extn.</th>
</tr>
</thead>
демо
посмотреть этот jsFiddle для кода и демонстрации. Поиск 5407
и первая строка будет отображаться, даже если данные отображаются только в дочерней строке.
Я должен спросить: что заставляет вас верить, что вы можете искать в содержимом дочерней строки, которую вы вводите динамически, только когда отображаются дочерние строки? А как column()
поиск может охватывать контент из других строк, когда-либо?
когда это сказано, есть, конечно, обходной путь. Вместо того, чтобы создавать содержимое дочерней строки снова и снова, держите его в массиве :
var details = [];
теперь, когда вы инициализируете таблицу, вы инициализируете содержимое дочерней строки :
...
columns: [{
className: 'details-control',
orderable: false,
data: null,
defaultContent: '',
render: function(data, type, row, meta) {
details[meta.row] = format(data);
}
},
...
в функции format () добавьте класс в поле добавочного номера для удобства доступа :
'<td class="extNo">' + d.extn + '</td>' +
когда вы показываете дочерние строки, вставьте предварительно созданный контент из details[]
вместо format()
:
if (row.child.isShown()) {
row.child.hide();
tr.removeClass('shown');
} else {
row.child(details[row.index()]).show();
tr.addClass('shown');
}
создайте фильтр, который возвращает только строки, которые имеют details[]
дочерняя строка, содержащая определенный добавочный номер:
function filterByDetailsExtNo(extNo) {
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
return $(details[dataIndex]).find('.extNo').text() == extNo;
}
)
table.draw();
$.fn.dataTable.ext.search.pop();
}
используйте этот пользовательский фильтр вместо column()
поиск в обработчиках ввода :
table.columns().every( function () {
$( 'input', this.footer() ).on( 'keyup change', function () {
filterByDetailsExtNo(this.value);
});
});
раздвоенная скрипка -> https://jsfiddle.net/7o67vhrz/
обновление. Чтобы применить вышеуказанный фильтр к общему поисковому окну:
$('.dataTables_filter input')
.off()
.on('keyup', function() {
filterByDetailsExtNo(this.value);
});
еще одна раздвоенная скрипка -> https://jsfiddle.net/ds3qp41g/
. Комбинируйте поиск деталей и" родной " поиск
function filterByDetailsExtNoAndInput(term) {
$.fn.dataTable.ext.search.push(
function(settings, data, dataIndex) {
if ($(details[dataIndex]).find('.extNo').text() == term) return true;
for (var i=0;i<data.length;i++) {
if (data[i].toLowerCase().indexOf(term.toLowerCase())>=0) {
return true
}
}
return false;
}
)
table.draw();
$.fn.dataTable.ext.search.pop();
}
скрипка -> https://jsfiddle.net/h2u4fowj/
это довольно старая тема, и принятый ответ действительно работает, но я хотел предложить альтернативное решение.
у меня была такая же проблема, не имея возможности искать в дочерних строках, и мое решение состояло в том, чтобы сделать скрытый <td>
В конце моей таблицы, содержащей данные в дочерних строках - таким образом, индексатор видит это, но пользователь этого не делает.
для ограниченного HTML, я добавил новый столбец:
<th class="hidden">Data</th>
затем, в пределах DataTables звоните:
//Within var table = $('#table').DataTable( {....
columns : [
//{ className : 'details-control'},
{ data : 'a' }, //a-e are the columns I want the user to see.
{ data : 'b' },
{ data : 'c' },
{ data : 'd' },
{ data : 'e' },
// this last one is my "index helper"
{ data : 'comments',
render : function(data, type, full, meta) {
return full.f + full.g + full.h + full.i;
}
}
],
тогда вам просто нужно скрыть эту колонку. Вы можете сделать это либо через рекомендуемый метод DataTables:
https://datatables.net/examples/basic_init/hidden_columns.html
или через метод, который я выбрал:
"createdRow" : function (row,data,index) {
$('td',row).eq(6).addClass('hidden');
}
//and the css...
.hidden {
visibility: hidden;
}
у вас остался один <td>
В конце вашей таблицы, которая содержит все из дочерних строк, но она невидима, и она работает с полем поиска/фильтром.