You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:01:19