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

Datatable加载时最后一列New Total显示undefined,修改输入后正常如何解决

Datatable初始化加载时New Total列显示undefined的解决办法

问题原因

问题由两个错误共同导致:

  • AJAX是异步请求,你在Datatable初始化后立即遍历计算total字段时,AJAX请求还没返回,表格还没有加载到真实数据,赋值操作无效
  • 直接遍历Datatable实例无法获取行数据,且计算时用到的r.qty、r.price和你数据源里的字段quantity、cost不匹配,取值为undefined导致计算结果异常

最优解决方案

直接修改New Total列的render逻辑,不需要依赖提前赋值的total字段,加载时会自动基于行数据计算结果,修改输入框更新数据后也会自动重新渲染:

{
    title: "New Total",
    "render": function (data, type, row) {
        return "$" + calcTotal(row.quantity, row.cost);
    }
}

修改后删除你原来写的这段无效代码即可:

var table = $('#example').DataTable();
$.each(table, function (i, r) {
    r.total = calcTotal(r.qty, r.price);
});

保留total字段的方案

如果你一定要保留通过total字段取值的逻辑,可以在Datatable配置里添加initComplete回调,等数据加载完成后再批量计算赋值:

var table = $('#example').DataTable({
    "ajax": {
        "url": apiurl,
        "type": 'GET',
        "datatype": 'json'
    },
    columns: [
        { title: "Item Key", data: "itemKey" },
        { title: "Description", data: "description" },
        { title: "Pounds", data: "pound" },
        {
            title: "Current Cost", data: function (data, type, row) {
                return '<input type="number" class ="price-input"  value="' + data.cost + '" style="background-color:lightgoldenrodyellow;">';
            }
        },
        { title: "Current Cost", data: "cost" },
        { title: "Unit", data: "unit" },
        {
            title: "Quantity", data: "quantity"
        },
        {
            title: "Total", data: function (data, type, row) {
               return data.cost * data.quantity;
            }
        },
        {
            title: "New Total", "data": "total",
            "render": function (data, type, row) {
                return "$" + data;
            }
        }
    ],
    // 新增初始化完成回调,等数据加载完成后执行
    "initComplete": function() {
        const api = this.api()
        // 遍历所有行计算total值
        api.rows().every(function() {
            const rowData = this.data()
            rowData.total = calcTotal(rowData.quantity, rowData.cost)
            this.data(rowData)
        })
        api.draw()
    }
});

同样需要删除你之前写的那段独立的遍历赋值代码。

内容的提问来源于stack exchange,提问作者user3471546

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:39:03