【发布时间】:2018-10-31 09:43:51
【问题描述】:
我认为这个问题会得到回答,但我无法解决这个问题。试过了:
- https://datatables.net/forums/discussion/25833/is-there-any-way-to-programmatically-select-rows
- https://datatables.net/reference/api/row().select()
我在 serverSide 模式下使用 DataTables 1.10.16 - 我的数据是通过 ajax 加载的,而不是在页面加载时加载。
我的标记只是一个带有 ID 的表格,#substancesTable:
<table id="substancesTable" cellspacing="0" width="100%">
<thead>
<tr>
<th>ID</th>
<th>EC</th>
<th>CAS</th>
<th>Name</th>
</tr>
</thead>
</table>
加载数据的js如下:
var substancesTable = $('#substancesTable').DataTable({
"processing": true,
"serverSide": true,
"searching": false,
"ajax": {
"url": "/get-substances.json",
"dataSrc": function (json) {
return json.data;
}
}
});
这很好地填充了我的表格。我有一个事件处理程序,这样当用户手动单击一行(#substancesTable 内的任何<td> 元素)时,它会发出进一步的 ajax 请求以获取更多数据,然后将这些数据填充到用户的 <td> 中点击。此代码还负责关闭/折叠任何打开的行:
$('#substancesTable tbody').on('click', 'td', function () {
var tr = $(this).closest('tr');
var row = substancesTable.row( tr );
if ( row.child.isShown() ) {
row.child.hide();
tr.removeClass('shown');
}
else {
row.child( expand_substance(row.data()) ).show();
tr.addClass('shown');
}
} );
上面的代码调用了一个函数expand_substance 来处理上面提到的ajax 请求。这一切都很好。
我想做的是找到一种以编程方式打开某些行的方法。我的意思是拥有一组用户点击的行 ID,例如
var openRows = [5, 6, 8, 33, 100];
此数组数据将存储在 Redis(缓存)中,因此如果用户离开页面,当他们返回时,openRows 中的数据将被加载,我想打开相应的行。但我不知道如何告诉 DataTables 打开第 5、6、8、33、100 行等。
上面的链接似乎对我不起作用。例如,如果我尝试:
substancesTable.row(':eq(0)', { page: 'current' }).select();
我收到控制台错误:
VM308:1 Uncaught TypeError: substancesTable.row is not a function
我不确定这是否是打开该行的方法,但找不到更多有用的信息。
那么,是否可以使用 JavaScript 根据一组已知 ID (openRows) 打开表格的某些行?
【问题讨论】:
-
你可以做类似
openRows.each(function({ $(this).show()});的事情吗? -
我不确定您在什么时候尝试调用 row() 但它看起来不像是基于错误的 DataTable API 的引用。可能物质表在调用 row() 之前被重新分配给其他东西。您可以通过再次调用 $("#substancesTable").DataTable() 来获取对已初始化 DT 的引用,而无需传递任何选项。
-
@PaulZepernick 谢谢。页面呈现后,我在控制台中使用它。我尝试使用
$("#substancesTable").DataTable().row(':eq(o)', {page: 'current'}).select();,但出现错误 - “VM967:1 Uncaught TypeError: $(...).DataTable(...).row(...).select is not a function” -
api 文档中返回的行对象没有 select() 方法:datatables.net/reference/api 你可以做 row(..).child().show() 或 row(..) .child().hide()
-
我刚刚注意到您将链接放在文档中... select() 方法显然是一些默认情况下不存在的 DataTable 扩展。我不熟悉它,但我的猜测是扩展没有加载。这位于提供的链接中文档的顶部“请注意 - 此属性需要 DataTables 的 Select 扩展。”
标签: javascript jquery datatables