Использование таблиц данных 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
содержит текст «abc 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>
Результатом вышеизложенного будет то, что текст «abc 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, которую я ожидаю использовать.