javascript - 在另一个数据表的子行中添加嵌套数据表

标签 javascript jquery ajax datatable datatables

我看到其他人在哪里问过这个问题(比如这里:Add child row as nested datatable within exisiting datatable),但我还没有看到它的答案。

我有一个使用子行功能的“主”数据表。这是初始化“主”数据表的代码。 (我把它包括在内只是为了彻底,但这里的一切都很完美。)

var table = $('#members');

var oTable = table.dataTable({

    "language": {
        "aria": {
            "sortAscending": ": activate to sort column ascending",
            "sortDescending": ": activate to sort column descending"
        },
        "emptyTable": "No data available in table",
        "info": "Showing _START_ to _END_ of _TOTAL_ entries",
        "infoEmpty": "No entries found",
        "infoFiltered": "(filtered1 from _MAX_ total entries)",
        "lengthMenu": "_MENU_ entries",
        "search": "Search:",
        "zeroRecords": "Loading..."
    },
    "buttons": [],
    "columnDefs": [
        {className: 'control'},
        {orderable: false, targets: 0 }
    ],
    // setup responsive extension: http://datatables.net/extensions/responsive/
    "responsive": true,
    "order": [

        [1, 'asc']

    ],
    "order-column": false,
    "lengthMenu": [
        [5, 10, 15, 20, -1],
        [5, 10, 15, 20, "All"] // change per page values here
    ],
    // set the initial value
    "pageLength": 5,
    "dom": "<'row' <'col-md-12'B>><'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r><'table-scrollable't><'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>", 
});

下一段代码紧跟在上面的代码之后,完成了两件事: 1)它可以防止同时打开多个子行(只是个人喜好)和 2) 使用 AJAX 调用来填充刚刚打开的子行。

 table.on('click', 'tr', function () {

        var id = $(this).attr('id');
        if($(this).hasClass('parent'))
        {
            table.$('tr.parent').not(this).find('td:first-child').trigger('click');

            var load_member_leads = $(this).next().find('td.child > ul > li span.dtr-data');
            //var load_member_leads = $('#test');

            $.ajax({
                url: base_url + 'process/load_member_leads',
                type: 'POST',
                data: {test:id},
                dataType: "html", 
                success: function(data){
                    console.log ("success");
                    load_member_leads.html(data);
                    formRepeater();
                    initTable1(id);
                },
                failure: function (data) {
                    console.log ("failed");
                }
            });
        }
    });

这部分代码看起来运行良好,但这里是它变得棘手的地方。在返回的 AJAX 数据中,我有一个 html 表,我想使用数据表插件对其进行初始化。本质上,我所拥有的是另一个“主”数据表的子行中的嵌套数据表。问题是,一切正常,直到我尝试使用以下方法初始化嵌套表上的数据表插件:

  initTable1(id);

(注意:传递的 id 变量是为了防止多个表具有相同的 id。您可以在下面的代码中看到它是如何附加到数据表 init 调用的。)调用此函数后,子行中的所有内容都会消失并从 DOM 中删除。就这样走了。我不知道为什么。

这是初始化第二个数据表的 initTable1() 函数中的代码:

 var table2 = $('#leads_' + id);

    var oTable2 = table2.dataTable({
        "language": {
            "aria": {
                "sortAscending": ": activate to sort column ascending",
                "sortDescending": ": activate to sort column descending"
            },
            "emptyTable": "No data available in table",
            "info": "Showing _START_ to _END_ of _TOTAL_ entries",
            "infoEmpty": "No entries found",
            "infoFiltered": "(filtered1 from _MAX_ total entries)",
            "lengthMenu": "_MENU_ entries",
            "search": "Search:",
            "zeroRecords": "No matching records found"
        },

        destroy: true,

        //setup buttons extentension: http://datatables.net/extensions/buttons/
        buttons: [],

        // setup responsive extension: http://datatables.net/extensions/responsive/
        responsive: {
            details: {
                type: 'column',
                target: -1
            }
        },
        "columnDefs": [ {
           className: 'control',
           orderable: false,
           targets:   -1
        } ],
        "order": [
            [0, 'asc']
        ],
        "ordering": false,
        "lengthMenu": [
            [5, 10, 15, 20, -1],
            [5, 10, 15, 20, "All"] // change per page values here
        ],
        // set the initial value
        "pageLength": 10,
        "dom": ""

    });

此外,这里是通过 AJAX 调用获取的代码。 (注意 $test 变量与传递给 initTable1 函数的 id 变量相同)

 <table class="table table-striped table-bordered dt-responsive" width="100%" id="leads_<?php echo $test; ?>">
                            <thead>
                                <tr>
                                    <th class="all">Column 1</th>
                                    <th class="all">Column 2</th>
                                    <th class="all">Column 3e</th>
                                    <th class="all">Column 4</th>
                                    <th class="all">Column 5</th>
                                    <th class="all">Column 6</th>
                                    <th class="all">Column 7e</th>
                                    <th class="all">Column 8</th>
                                    <th class="none">Column 9</th>
                                    <th class="all">Column 10</th>
                                </tr>
                            </thead>
                            <tbody>
                            <!-- table rows populated here - this is currently hardcoded for testing -->
                            </tbody>
                        </table>

以下是有效的方法,它可能会揭示问题的实际原因。

1) 如果我在 AJAX 调用中注释掉 initTable1() 函数,它就可以工作...除了第二张表上数据表插件的初始化之外的所有内容。但是 html 填充了它应该在“主”数据表的子行中的位置。

2) 如果我更改填充 AJAX 数据的位置,它会起作用 - 具体来说,它会在“主”数据表之外起作用。它不仅填充它应该填充的位置(注意指向 $('#test'). 的注释掉的 var load_member_leads),而且它还正确地初始化数据表。

如果我同时在第二个表上初始化数据表,并将所述表放在“主”数据表的子行中,它似乎只会中断。所谓中断,我的意思是完全消失,就好像 AJAX 调用失败一样 - 根据 console.log,这并非如此。

这个问题快把我逼疯了,我做错了什么?任何帮助深表感谢!

最佳答案

在这个问题上花了几个小时后我觉得有点愚蠢,但事实证明我使用的是响应式扩展而不是数据表的内置功能。对于遇到此问题的任何其他人,只需按照此处示例中的需要修改代码即可:https://datatables.net/examples/api/row_details.html

关于javascript - 在另一个数据表的子行中添加嵌套数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726346/

相关文章:

javascript - jQuery ajax 返回readyState 1或不正确的数据类型

javascript - JSON响应数据中的数据长度

javascript - Django : Ajax form still reloads the whole page

javascript - 谷歌浏览器新标签页的 URL 是什么以及如何将其从 manifest.json 中排除

javascript - 当用于观看 li 时,Angular $watch 旧值始终等于新值

javascript - 数组在 res.json() 中为空,但在 res.json() 调用之前和之后都存在

javascript - 如何重写javascript库函数?

jquery - 选择特定的有序列表

javascript - ES6 模块 "Uncaught ReferenceError: function is not defined at HTMLButtonElement.onclick"

javascript - 验证动态单选按钮、复选框和文本区域