javascript - 动态添加列到数据表会抛出 "Cannot read property ' style' of undefined”

标签 javascript datatables

我有一个使用 jQuery DataTables 创建的数据表,使用动态列数创建:

            this.vehiclesDataTable = $("#vehiclesTable").DataTable({
            destroy: true,
            "dom": '<"top">rt<"bottom"lp>i<"clear">',
            responsive: true,
            data: data,
            columns: this.dynamicColumns
        });

这是我为 data:property 传入的示例数据:

[[0,"2016-05-01",0],[0,"2016-06-01",0],[0,"2016-07-01",0],[0,"2016-08-01",1],
[0,"2016-09-01",1],[0,"2016-10-01",0],[0,"2016-11-01",0],[0,"2016-12-01",0],
[0,"2017-01-01",0],[0,"2017-02-01",0],[0,"2017-03-01",0],[0,"2017-04-01",0],
[0,"2017-05-01",0]]

...以及 columns 属性,其中 3 列与数据匹配:

[{"className":"details-control","sTitle":" ", 
"orderable":false,"data":null,"defaultContent":""," sWidth":"2%", 
"name":"expandCollapseRow"}, {"title":"Date"," sWidth":"100px"},
{"title":"testworks","sWidth":"30px","sClass":"dataTableAlignRight"}]

这工作正常并创建一个有效的数据表。但是,当尝试将此表重新绑定(bind)到具有超过 3 列的数据时 - 很多时候我都会收到错误:

"Cannot read property 'style' of undefined"

即使我首先使用以下方法完全刷新数据表:

        vehiclesDataTable.clear();
        $('#vehiclesTable').empty();

CodePen 示例: Dynamic columns using DataTables

最佳答案

查看 your example ,我看到您正在通过已经实例化的 jQuery/DOM 对象重新实例化插件。

所以这里有两个问题:

  1. 第二次调用 createDataTable() 函数时,$("#vehiclesTable") 选择器匹配相同的 DOM 对象,但其内容已被更改第一个 DataTable 实例化,我不知道如何,但 DataTable 很可能以某种方式使用原始容器内容(或者可能只是删除它,但你是使用 theadtbody 节点在 html 中填充它,这绝对不是第二个实例化会找到的内容。

  2. 正如我所说,您正在通过相同的 DOM(但由 DataTable 增强/困惑)对象再次实例化DataTable。所以事情肯定会出错......

我不知道DataTables插件是否有API功能来改变其内容(和标题配置等...),这就是我认为你的试图实现。但在first glance我不这么认为(如果有的话,它可能比简单地删除该表并用新的表替换它更复杂。

因此,最好的解决方案可能是简单地删除现有表并(正如您实际上所做的那样)从头开始再次实例化 DataTables 插件但在新创建的新鲜 DOM 上对象

那就是(稍微简化一下......)替换:

vehiclesDataTable = $("#vehiclesTable").DataTable(...);

vehiclesDataTable = $("<table></table>"); // Insert here thead and tbody if really necessary.
$("#vehiclesTable").replaceWith(vehiclesDataTable);
vehiclesDataTable.attr("id", "vehiclesTable"); // (Added after replacement to avoid two elements having same id)
vehiclesDataTable.DataTable(...);

这样,每次调用 createDataTable() 函数时,所有旧内容都会被丢弃,并且不会发生副作用。

关于javascript - 动态添加列到数据表会抛出 "Cannot read property ' style' of undefined”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46817895/

相关文章:

javascript - 为什么我的检查 float 的测试总是返回 false?

javascript - 提供给匿名函数的参数

jquery - 检查的计数器在 jquery 数据表分页中不起作用

javascript - 无法根据下拉列表中选定的值过滤数据表数据

javascript - 单击不同行的选项卡时删除事件类 jQuery ui

javascript - JavaScript 中的 'if' 语句是否需要花括号?

javascript - 将格式不正确的 XML 文档转置为 HTML 无序列表

JavaScript:数据表服务器端处理 - 显示前更改值

javascript - 使用 x-editable 更新行中的值后,jquery 数据表不排序

c# - 如何在 DataTables jQuery 插件中传递 AJAX 数据?