如何将Socket接收的JSON数据填充至Ajax DataTable?
用Socket接收的JSON数据填充DataTable的解决方案
场景1:一次性加载数据(首次收到数据初始化表格)
当Socket首次推送数据后初始化DataTable,直接将收到的data作为表格数据源,无需保留原代码中的ajax配置。同时要避免重复初始化表格导致的错误,先检查并销毁已存在的表格实例:
socket.on('getinvoices', (data) => { // 适配数据结构:如果后端返回的是包含doc字段的对象,取data.doc;否则直接用data const tableData = data.doc || data; // 销毁已存在的表格实例(如果有) if ($.fn.DataTable.isDataTable('#table1')) { $('#table1').DataTable().destroy(); } $('#table1').DataTable({ dom: 'Bfrtip', buttons: ['copy', 'csv', 'excel', 'pdf', 'print'], order: false, data: tableData, // 直接传入Socket收到的数据 columns: [ { data: 'recipientName' }, { data: 'recipientAddress' }, { data: 'recipientPhoneNumber' }, { data: 'recipientEmail' }, // 修正services字段的渲染:遍历数组拼接内容 { data: 'services', render: (services) => services.map(item => item.serviceName).join(', ') }, { data: 'services', render: (services) => services.map(item => item.servicePrice).join(', ') }, { data: null, className: "dt-center editor-delete", orderable: false, render: (data) => `<button class="btn viewbtn" value="${data._id}">Edit</button>` }, { data: null, className: "dt-center editor-delete", orderable: false, render: (data) => `<button class="btn viewbtn2" value="${data._id}">Print Invoice</button>` } ] }); });
场景2:多次更新数据(Socket重复推送数据刷新表格)
如果Socket会多次推送新数据,建议提前初始化空表格,后续收到数据时仅更新表格内容,避免重复初始化:
// 提前初始化空表格(放在Socket回调外,比如页面加载完成后) const table = $('#table1').DataTable({ dom: 'Bfrtip', buttons: ['copy', 'csv', 'excel', 'pdf', 'print'], order: false, columns: [ { data: 'recipientName' }, { data: 'recipientAddress' }, { data: 'recipientPhoneNumber' }, { data: 'recipientEmail' }, { data: 'services', render: (services) => services.map(item => item.serviceName).join(', ') }, { data: 'services', render: (services) => services.map(item => item.servicePrice).join(', ') }, { data: null, className: "dt-center editor-delete", orderable: false, render: (data) => `<button class="btn viewbtn" value="${data._id}">Edit</button>` }, { data: null, className: "dt-center editor-delete", orderable: false, render: (data) => `<button class="btn viewbtn2" value="${data._id}">Print Invoice</button>` } ] }); // Socket回调中更新表格数据 socket.on('getinvoices', (data) => { const tableData = data.doc || data; // 清空现有数据 -> 添加新数据 -> 刷新表格 table.clear().rows.add(tableData).draw(); });
关键说明
- 移除原代码中的
ajax配置,因为我们直接使用Socket接收的data作为数据源,无需从URL拉取数据。 - 修正
services字段的渲染逻辑:原代码中services[/ ].serviceName的写法不被DataTable支持,改用render函数遍历数组,将多个服务名称/价格拼接成字符串显示。 - 将按钮列的
orderable设为false,按钮列无需排序功能,更符合使用场景。
内容的提问来源于stack exchange,提问作者mlam
相关产品推荐
相关产品推荐

