我正在使用apache加载数据,并在DataTable中动态生成列名。根据用户的选择,我的数据表有不同的列数。(有一个下拉列表)。
例如,下拉列表中有两个选项,南部省和北部省。南部省表有4列,北部省表有6列。
情景1
第一个用户选择南部省,有4列。然后它生成表没有错误,但在此之后,如果用户选择北部省,其中有6列,表不生成和js控制台打印错误如下。Uncaught TypeError: Cannot read property 'style' of undefined jquery.dataTables.js:3828
情景2
第一个用户选择北部省,有6列。然后它生成表没有任何错误,但在此之后,如果用户选择南部省,其中有4列,表不生成和js控制台打印错误如下。Uncaught TypeError: Cannot read property 'mData' of undefined jquery.dataTables.js:6122
但如果两个表具有相同的列数,则两个表都不会生成错误。
我该如何解决这个问题?
这里是JS代码
jQuery(document)
.ready(
function() {
$('#province-list').change(
function() {
var prov = $(this).val();
if (prov == "sp") {
make_SP();
} else if (prov == "np") {
make_NP();
}
});
function make_SP() {
$("#dataTables-res_item")
.dataTable(
{
"bDestroy" : true,
"bProcessing" : false,
"bServerSide" : true,
"sAjaxSource" : "/province_list_view?p_name=sp",
"aoColumns" : [
{
"mData" : "result_date",
"sTitle" : "Result Date"
},
{
"mData" : "result_day",
"sTitle" : "Result Day"
},
{
"mData" : "draw_number",
"sTitle" : "Draw Number"
},
{
"mData" : "draw_time",
"sTitle" : "Draw Time"
} ],
"order" : [ [ 0, "desc" ] ]
});
};
function make_NP() {
$("#dataTables-res_item")
.dataTable(
{
"bDestroy" : true,
"bProcessing" : false,
"bServerSide" : true,
"sAjaxSource" : "/province_list_view?p_name=np",
"aoColumns" : [
{
"mData" : "result_date",
"sTitle" : "Result Date"
},
{
"mData" : "result_day",
"sTitle" : "Result Day"
},
{
"mData" : "draw_number",
"sTitle" : "Draw Number"
},
{
"mData" : "draw_time",
"sTitle" : "Draw Time"
},
{
"mData" : "draw_place",
"sTitle" : "Draw Place"
},
{
"mData" : "draw_person",
"sTitle" : "Agent"
} ],
"order" : [ [ 0, "desc" ] ]
});
};
});
5条答案
按热度按时间t98cgbkg1#
当我更新的数据与以前的数据有不同的列数时,我也遇到了同样的问题。食谱真的很简单!在列数变化**的场景下,
Destroy function
与$("#datatable").empty();
配合使用。因此,在重新加载数据之前,您的代码将包含以下行:因此,总体而言,您的代码可能看起来像这样:
46scxncf2#
我认为最安全的方法是完全删除表,然后在重新初始化之前将其重新插入到DOM中。在我看来,dataTables并没有完全删除所有生成的内容,这就是为什么会发生错误(出于不同的原因)。从理论上讲,它应该像上面一样工作,或多或少,但它没有。考虑这个解决方案:
[full源代码在下面的演示链接]
这是可行的。参见demo ->**http://jsfiddle.net/gss4a17t/**基本上它和OP中的一样,但是我没有为不同的省份提供不同的功能,而是为不同的省份制作了不同的
aoColumns
等等。我没有依赖bDestroy
,而是用dataTable.fnDestroy(true)
(DOM * 和 * 以及dataTables注入)删除了整个<table>
,然后在重新初始化dataTable之前重新插入<table>
-skeleton。我不知道这是否适合OP的需要,但这就是我会怎么做。它对于未来的更改更加灵活,
aoColumns
-对象可以从脚本自动生成,或者通过AJAX从服务器实现(例如,如果您希望为不同的语言提供不同的标题)。“腰带和背带”:)btxsgosb3#
有很好的解决办法,但在遇到这个问题后,活力仍然在我脑海中响起。我想分享这一点,而不是在js的出口。所以请评论。
这就是我打电话的方式
这里是d1,d2...是你的回应的关键。现在我们不需要担心用户选择哪个值。注:这不是直接解决这个问题,但它是比喻
hk8txs484#
我知道这是一个老问题,但由于我花了几个小时试图用DataTables 1.10.18解决它,我希望它能帮助别人。我使用JavaScript数组作为数据源,并使用jQuery 1.12.4。这是基于@davidkonrad的回答。
超文本标记语言:
JS:
bd1hkmkf5#