我有一个dataTable,可以根据用户检查的内容过滤列。
我希望用户能够导出他们当前在dataTable上看到的内容。所以我在每个复选框上都有一个data-column
属性,让我知道哪个列应该根据是否被选中显示或隐藏。
我已经像这样初始化了我的表:
var table = $('.my-table').DataTable({
pageLength:25,
fixedHeader: true,
sScrollX: true,
dom: '<"html5buttons"B>lTfgitp',
buttons: [
{extend: 'copy'},
{extend: 'csv',
title: 'Testing',
exportOptions: {
columns: get_columns_to_export(),
rows: { selected: true }
},
'customize': function(doc){
console.log("==CSV DOC==");
console.log(doc);
}
},
{extend: 'excel',
title: 'Testing',
exportOptions: {
columns: get_columns_to_export(),
rows: { selected: true }
},
'customize': function(doc){
console.log("==EXCEL DOC==");
var sheet = doc.xl.worksheets['sheet1.xml'];
console.log(sheet);
}
},
{extend: 'print',
customize: function (win){
$(win.document.body).addClass('white-bg');
$(win.document.body).css('font-size', '10px');
$(win.document.body).find('table')
.addClass('compact')
.css('font-size', 'inherit');
}
}
]
});
函数get_columns_to_export
只返回可见列的编号列表,这实际上有效,但仅限于页面加载。
如果我取消隐藏某些列(以便get_columns_to_export()
返回包含额外数字的其他数组),导出的文件将只包含它在表加载时找到的原始列。
我查找了如何再次触发按钮,但现在遇到的问题是,在JS用完堆栈大小之前,DataTables有一个无限循环。
在DataTables文档中,我使用button.trigger()
找到了here,其中包含以下内容:
$('.buttons-excel').on('click',function(){
table.button('.buttons-excel').trigger();
});
这会导致无限循环发生。我还尝试在触发操作后添加return
语句,但由于某种原因,它忽略了这一点并直接进入我在{{1}的原始声明中声明的原始customize
函数。 }}
如何使用正确的列号更新DataTables,而不是以无限循环结束?
答案 0 :(得分:1)
将exportOptions部分更改为
exportOptions: {
columns: get_columns_to_export.bind(this),
rows: { selected: true }
},
数据表列选择器可以采用各种选项,其中包括字符串或函数。
在原始示例中,您在编译时调用函数get_columns_to_export()一次,此函数返回列的初始状态,这是列分配给列选择器。
因为您的列是动态的,所以您希望使用列选择器的函数形式,每次执行按钮操作时都会调用该函数形式。
触发函数调用click函数触发按钮,触发无限循环。摆脱这个以阻止循环。