Использование DataTables 1.10.18.
Я пытаюсь использовать метод .row().child()
, как описано в документации (https://datatables.net/reference/api/row (). Child () ), чтобы добавить дочерняя строка таблицы.
Я использую DataTables в режиме serverSide
, но визуализированная разметка для строки моей таблицы выглядит следующим образом:
<tbody>
<tr>
<td><a class="expand-row" href="/get-data.json"> <i class="fa-plus"></i> </a></td>
<td>Foo</td>
<td>Bar</td>
<td>Baz</td>
<td>2020-02-02</td>
</tr>
</tbody>
Я написал js, который обрабатывает нажатие на значок «плюс», который отображается с помощью класса .fa-plus
в разметке выше. Это FontAwesome значок «плюс». js выглядит следующим образом:
$('table tbody').on('click', '.expand-row', function (e) {
e.preventDefault();
var tr = $(this).closest('tr');
var row = $(this).closest('table').DataTable().row(tr);
if (row.child.isShown()) {
row.child.hide();
tr.removeClass('active');
$(this).find('i').toggleClass('fa-minus fa-plus');
} else {
row.child('Loading...').show();
// Ajax request to get child row data
$.get($(this).attr('href')).done(function(response) {
// Add the child row data to the table and show it
row.child(response).show();
});
tr.addClass('active');
$(this).find('i').toggleClass('fa-plus fa-minus');
}
});
Это расширяет строку, показывает сообщение «Загрузка ...», а затем выполняет ajax вызов атрибута href
значка, по которому щелкают, что в этом примере это /get-data.json
. Цель этого вызова ajax - получить данные, которые должны отображаться в дочерней строке. Он также переключает значок FontAwesome на «минус», чтобы указать, что дочерняя строка видима (расширенная строка).
Пока все это работает.
У меня проблема со строкой:
row.child(response).show();
Это работает в том смысле, что показывает дочернюю строку , Но строка занимает всю ширину таблицы, которая в этом случае имеет 5 столбцов. Предполагая, что ajax response
содержал текст «ab c 123», визуализированная разметка выглядит так:
<tr>
<td colspan="5">
abc 123
</td>
</tr>
colspan="5"
автоматически добавляется DataTables, потому что согласно связанным документам:
Каждая дочерняя строка обычно содержит одну ячейку, для которой установлен атрибут colspan
, охватывающий всю ширину таблицы, поэтому содержимое ячейки охватывает всю ширину таблицы. Однако также можно передать элемент tr
, который имеет несколько ячеек (по одной для каждого столбца в таблице), чтобы показать данные дочерней строки в той же структуре столбца, что и основная таблица.
В моем случае я хочу, чтобы разметка была такой:
<tr>
<td></td>
<td></td>
<td colspan="2">
abc 123
</td>
<td></td>
</tr>
В результате вышесказанного текст "ab c 123" появится под заголовками 3-го и 4-го столбцов потому что он начинается в 3-м столбце и имеет colspan="2"
, то есть до 4-го столбца.
Я пробовал это на основе документов:
row.child(
'<tr>' +
'<td></td>' +
'<td></td>' +
'<td colspan="2">' +
response +
'</td>' +
'<td></td>' +
'</tr>'
).show();
Но это выглядит как ...
<tr>
<td colspan="5">
<tr>
<td></td>
<td></td>
<td colspan="2">abc 123</p>
<td></td>
</tr>
</td>
</tr>
... это не то, что я хочу.
Оборачивает <tr><td colspan="5"> ... </td></tr>
вокруг того, что я указал, что означает, что оно не воспроизводится так, как я хочу.
Я не знаю, как это исправить или указать, что я не ' не хочу этого <td colspan="5">
. Кажется, что DataTables добавляет это автоматически, хотя я указал точную строку HTML, которую я ожидаю использовать.