Firestore数据加载后Bootstrap DataTable功能失效问题排查
问题原因与解决方案
这并不是Bootstrap表格本身的问题,核心原因是DataTables在初始化时表格还没有数据,而你后续动态插入数据后,没有通知DataTables更新状态。
DataTables会在页面加载完成后(通过你引入的jquery-datatable.js)自动初始化指定的表格,但此时你的<tbody>是空的。当你从Firestore异步获取数据并手动插入DOM后,DataTables并不知道表格内容已经发生了变化,所以分页、条目选择这些依赖DataTables内部数据管理的功能就失效了。
下面给你两种可行的解决办法:
方法一:使用DataTables API动态添加数据(推荐)
这种方式让DataTables全程管理表格数据,是最规范的用法,能避免各种同步问题:
// 先初始化DataTables实例(如果你的初始化脚本没做这件事,就手动添加) const coverTransTable = $('#tabel_CoverTrans_details').DataTable(); const CoverTransactionRef = db.collection('HdCoverTransaction'); CoverTransactionRef.get().then(snapshot => { snapshot.docs.forEach(doc => { var coverSummary = doc.data(); // 用DataTables的row.add()方法添加行数据 coverTransTable.row.add([ doc.id, // 注意:你的表头是"Date & Time",确保doc.id是对应的时间值 coverSummary.ReceiptNo, coverSummary.TransType, coverSummary.OpenStock, coverSummary.TotalQty, coverSummary.ClosingStock ]); }); // 所有数据添加完成后,调用draw()更新表格 coverTransTable.draw(); }).catch(error => { console.log(error.message); });
方法二:手动重新初始化DataTables
如果你更习惯用innerHTML插入DOM,可以在所有数据插入完成后,重新初始化DataTables(先销毁旧实例,避免冲突):
const coverTransTableBody = document.getElementById('coverTrans_fields'); const CoverTransactionRef = db.collection('HdCoverTransaction'); CoverTransactionRef.get().then(snapshot => { var content = ''; snapshot.docs.forEach(doc => { var coverSummary = doc.data(); let html = `<tr> <td>${doc.id}</td> <td>${coverSummary.ReceiptNo}</td> <td>${coverSummary.TransType}</td> <td>${coverSummary.OpenStock}</td> <td>${coverSummary.TotalQty}</td> <td>${coverSummary.ClosingStock}</td> </tr>`; content += html; }); // 所有行拼接完成后再一次性插入DOM(比循环里每次插入性能更好) coverTransTableBody.innerHTML = content; // 销毁旧的DataTables实例(如果存在) if ($.fn.DataTable.isDataTable('#tabel_CoverTrans_details')) { $('#tabel_CoverTrans_details').DataTable().destroy(); } // 重新初始化DataTables $('#tabel_CoverTrans_details').DataTable(); }).catch(error => { console.log(error.message); });
另外提个小优化:你之前在forEach循环里每次都设置coverTransTableBody.innerHTML = content,这样会频繁操作DOM,性能较差,改成循环结束后一次性插入会更高效,上面的代码已经帮你调整了这一点。
内容的提问来源于stack exchange,提问作者Ruzna
相关产品推荐
相关产品推荐

