加载结果导致无限循环后,jQuery DataTables按钮触发

时间:2017-09-11 23:35:08

标签: javascript jquery datatables

我有一个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,而不是以无限循环结束?

1 个答案:

答案 0 :(得分:1)

将exportOptions部分更改为

exportOptions: {
                    columns: get_columns_to_export.bind(this),
                    rows: { selected: true }
                },

数据表列选择器可以采用各种选项,其中包括字符串或函数。

在原始示例中,您在编译时调用函数get_columns_to_export()一次,此函数返回列的初始状态,这是列分配给列选择器。

因为您的列是动态的,所以您希望使用列选择器的函数形式,每次执行按钮操作时都会调用该函数形式。

触发函数调用click函数触发按钮,触发无限循环。摆脱这个以阻止循环。