javascript - 向 DataTables 表添加数据时无法更改页面
问题描述
我有一个 dataTables 表并在其中添加了大量行。我希望能够在添加数据时使用表格。
问题是 DataTables 代码在每次.draw()
执行时重建分页块,与传递给函数的参数无关。
目前,我通过“入侵”aoDrawCallback
列表并拦截pagination
回调部分解决了这个问题。添加行时,我允许在页码或总页数更改时重新绘制分页块。
该await sleep(..);
块提供 2 个功能:
- 它允许在
for
循环执行期间重绘表格; - 它足够延迟代码,因此用户可以在重绘之前点击分页按钮(即使考虑到现在我们重绘它们的频率降低了 10 倍 - 取决于
show X entries
值)
根据表的复杂性,睡眠值(以毫秒为单位)可以减少到 1。
请参阅下面和JSFIddle中的代码
我的解决方案的一个缺陷是我们在每个循环上浪费了睡眠时间。你能在那里提供更好的解决方案吗?
谢谢。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
var oldPaginationCb;
var prevPage=-1, prevPages=-1;
var isCustomPaginationEnabled = false; //Our custom actions are disabled by default
function myPaginationCb ( settings ) {
var
start = settings._iDisplayStart,
len = settings._iDisplayLength,
visRecords = settings.fnRecordsDisplay(),
all = len === -1,
page = all ? 0 : Math.ceil( start / len ),
pages = all ? 1 : Math.ceil( visRecords / len );
if (! (isCustomPaginationEnabled && page === prevPage && pages === prevPages)) {
prevPage = page;
prevPages = pages;
return oldPaginationCb(settings);
}
}
console.log('started');
var values = [...Array(500).keys()]
var commentTable = $('.commentTable').DataTable();
var dtApi = $('.commentTable').dataTable();
//Replacing the pagination draw callback function
var paginationCallback = dtApi.fnSettings().aoDrawCallback.filter(cb => { return cb.sName === "pagination" })[0];
oldPaginationCb = paginationCallback.fn;
paginationCallback.fn = myPaginationCb;
$('.addComment').on('click', async function () {
isCustomPaginationEnabled = true;
for(var i=0; i<values.length; i++) {
commentTable.row.add(
[
'Date',
'User',
i,
]
).draw(false);
await sleep(50);
}
isCustomPaginationEnabled = false;
});
<link href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.js"></script>
<div><strong>
Click Start, then try using the table navigation buttons
</strong></div>
<button class="addComment">
Start
</button>
<table class='commentTable'>
<thead>
<th>Date</th>
<th>User</th>
<th>Comment</th>
</thead>
<tbody>
</tbody>
</table>
解决方案
推荐阅读
- java - 在这个问题中如何使用嵌套 For 循环?(没有数组)
- ruby-on-rails - 为什么我在渲染模板后无法访问模型错误?
- javascript - 使用 React 和 Gatsby 从父母那里将道具传递给孩子
- javascript - 如何使滚动箭头在顶部和底部消失?JavaScript
- java - 迭代时将元素添加到列表时出现 ConcurrentModiciationException
- python - 在自定义函数的上下文中,在 Python 中四舍五入十进制数的最简单方法是什么?
- javascript - 如何从 Mongodb 获取数据并将其显示在相应的 html 表单字段中?
- linux - 在 ubuntu 上安装 node-sspi 时出错
- c# - 对于 .NET 字典,双重哈希如何工作?
- javascript - 如何使用 vuetify 使我的 v-menu 正确显示