如何在加载数据表时展开所有向下钻取的行,包括隐藏的行

时间:2014-04-24 16:22:02

标签: jquery-plugins datatables jquery-datatables

我正在根据要求创建一个具有向下钻取(行详细信息)子数据表的数据表。我在使用向下钻取(行详细信息)方法时能够创建子数据表,但发现很难扩展所有这些在加载表时具有向下钻取关联的行。这是我的代码,它可以工作并扩展当前分页表中的所有向下钻取行。但是当单击下一个分页(数字或页面)时,行显示为展开(您知道可以看到&#39 ;减去'(关闭)图标图像)但没有子数据表。据我所知,这是因为,当我试图模拟点击“img”时。对于向下钻取行关联的属性,它成功应用于当前页面中的当前行,但对于其余不在dom中的属性,脚本表示子数据表未定义。围绕这一点的任何想法或建议都会对我有所帮助..

以下是代码段 -

表HTML源代码 -

    <table id="mastertable" class="table table-striped table-bordered table-hover dataTable" aria-describedby="sample-table-2_info">
        <thead>
            <tr role="row">
                <!-- <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Domain: activate to sort column ascending" style="width: 255px;"></th> -->
                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Domain: activate to sort column ascending" style="width: 25%;">Project Name</th>
                <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Price: activate to sort column ascending" style="width: 10%;">Status</th>
                <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Clicks: activate to sort column ascending" style="width: 10%;">Start Date</th>
                <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Clicks: activate to sort column ascending" style="width: 10%;">End Date</th>
                <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Clicks: activate to sort column ascending" style="width: 10%;">FCS Date</th>
                <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Clicks: activate to sort column ascending" style="width: 10%;">Project Phase</th>
                <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" aria-label="Clicks: activate to sort column ascending" style="width: 15%;">Defects</th>
            </tr>
        </thead>


    <tbody role="alert" aria-live="polite" aria-relevant="all">

    <tr>


                <td class=" ">

                <img src="/tester/theme/v_1_0/app-images/details_open.png"  masterProject="master-ROORKELA"/>

                    <a href="/tester/dashboard/project/abc">ROORKELA </a> <font color="black">(System Project)</font>

// THIS IS THE SUB DATATABLE HIDDEN IN DIV AND THE ID OF THE DIV IS STORED IN THE IMG ATTRIBUTE ABOVE UNDER THE 'masterProject' attribute - [masterProject="master-ROORKELA"]

                    <div class="hide" id="master-ROORKELA">

                                <table id="subProjects-table" class="table table-striped table-bordered table-hover subTable" aria-describedby="sample-table-2_info">
                                    <thead>
                                        <tr role="row">
                                            <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 255px;">Project Name</th>
                                            <th class="sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 186px;">Status</th>
                                            <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 203px;">Start Date</th>
                                            <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 203px;">End Date</th>
                                            <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 203px;">Targetted Date</th>
                                            <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 203px;">Project Phase</th>
                                            <th class="hidden-480 sorting" role="columnheader" tabindex="0" aria-controls="sample-table-2" rowspan="1" colspan="1" style="width: 203px;">Defects</th>
                                        </tr>
                                    </thead>


                                    <tbody role="alert" aria-live="polite" aria-relevant="all">

                                    <tr>

                                                <td class=" " style="width: 26%;text-align:center;vertical-align: middle;">

                                                    <a href="/tester/dashboard/project/abc">Sirish</a>

                                                </td>
                                                <td class="hidden-480 " style="width: 10%;">
                                                    <span class="label label-sm label-warning">Minor Impact</span>
                                                </td>
                                                <td class=" " style="width: 10%;">Feb 12 2013</td>
                                                <td class="hidden-480 " style="width: 10%;">Nov 12 2013</td>
                                                <td class=" " style="width: 10%;">Jan 16 2014</td>
                                                <td class=" " style="width: 10%;">EFT</td>
                                                <td class=" " style="width: 15%;">
                                                <a href="/tester/dashboard/project/abc/defects.html" class="modal-link" data-toggle="modal" data-target="#displayDefects">22 defects</a>

                                            </tr>


                                </tbody>
                            </table>

                    </div>

                </td>
                <td class="hidden-480 ">
                    <span class="label label-sm label-warning">Minor Impact</span>
                </td>
                <td class=" ">Feb 12 2013</td>
                <td class="hidden-480 ">Nov 12 2013</td>
                <td class=" ">Jan 16 2014</td>
                <td class=" ">TESTING</td>
                <td class=" "><a href="/tester/dashboard/project/abc/defects.html" class="modal-link" data-toggle="modal" data-target="#displayDefects">22 defects</a>
            </tr>

    </tbody>

    </table>

定义初始表 -

  var oTable = $('#mastertable').dataTable( {

                "aLengthMenu": [[5,10, 25, 50, 100 , -1], [5,10, 25, 50, 100, "All"]],
                "iDisplayLength" : 10,
                "aoColumnDefs": [
                             {"sWidth": "25%", "aTargets": [ 0 ] },
                             {"sWidth": "10%", "aTargets": [ 1 ] },
                             {"sWidth": "10%", "aTargets": [ 2 ] },
                             {"sWidth": "10%", "aTargets": [ 3 ] },
                             {"sWidth": "10%", "aTargets": [ 4 ] },
                             {"sWidth": "10%", "aTargets": [ 5 ] },
                             {"sWidth": "15%", "aTargets": [ 6 ] },

                             {"sClass": "align-left" , "aTargets": [ 0,1,4, 2,3,5,6] }              
                         ],
                "sDom": '<"row"<"col-sm-4"l><"col-sm-6"f><"col-sm-1 saveas_div"T><"col-sm-1 filtering_div"C>r>t<"row"<"col-sm-6"i><"col-sm-6"p>>',

                "oTableTools": {
                    "aButtons": [
                               {
                                   "sExtends": 'csv',
                                 "sButtonText":'Export as CSV',
                                   "mColumns":"visible"
                               }
                           ]
                },
            "aoColumns": [
              { "bSortable": true },
              null, null, null,null, null, 
              { "bSortable": true }
            ],
            "bStateSave": true,
             "fnStateSave": function (oSettings, oData) {
                 localStorage.setItem( 'DataTables_'+window.location.pathname, JSON.stringify(oData) );
             },
             "fnStateLoad": function (oSettings) {
                 return JSON.parse( localStorage.getItem('DataTables_'+window.location.pathname) );
             }

            });

将点击事件关联到&#39; img&#39;表中的属性 -

 oTable.$('td').each( function () {

                    $(this).on('click','img', function () {
                        var nTr = $(this).parents('tr')[0];
                        if ( oTable.fnIsOpen(nTr) )
                        {
                            /* This row is already open - close it */
                            this.src = "${pageContext.request.contextPath}/theme/v_1_0/app-images/details_open.png";
                            oTable.fnClose( nTr );
                        }
                        else
                        {
                            /* Open this row */
                            this.src = "${pageContext.request.contextPath}/theme/v_1_0/app-images/details_close.png";

                            var masterProject = $(this).attr("masterProject");

                            var html = $("#"+masterProject).html();

                            console.log(html); // THIS IS WHERE I SEE AS UNDEFINED FOR HIDDEN TR ELEMENTS WHICH ARE HIDDEN DURING PAGINATION

                            oTable.fnOpen(nTr, html, 'details');

                            }
                    } );    

                    $(this).find('img').trigger('click'); // THIS IS WHERE I"M SIMULATING CLICK EVENT TO EXPAND ALL ROWS WHILE LOADING PAGE BY DEFAULT.

            });

我尝试使用-fnDrawCallback方法来模拟点击事件,但它给了我奇怪的结果,这意味着行在1,3,5等备用页面上展开,但是在连续的页面上。

很抱歉这个独白,因为我只想解释问题的细节。

请传递您宝贵的建议或解决方案..

非常感谢, Sirish。

2 个答案:

答案 0 :(得分:1)

所以我在按钮上添加了功能以折叠所有并展开所有子行。这将与分页,搜索和

一起使用
    <script>
    function format ( d ) {
    // `d` is the original data object for the row
    return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
        '<tr>'+
            '<td>Full CallStack:</td>'+
            '<td style="text-align:left;">'+d.call_stack+'</td>'+
        '</tr>'+
    '</table>';
}

$(document).ready(function() {
    var isCollapse = 1;
    var visited_cehck = 0;
    var table = $('#example').DataTable( {
        "aaData": $Json_data,
   "aoColumns": [
        { "sTitle": "col1", "mData": "col1" },
        { "sTitle": "col2",  "mData": "col2" },      
        { "sTitle": "col3",  "mData": "col3" },
        { "sTitle": "col4",  "mData": "col4" },
        { "sTitle": "col5",   "mData": "col5" },
        {
        "class":          'details-control',
        "orderable":      false,
        "data":           null,
        "defaultContent": ''
        }
    ]
    } );


 //This function gets the length of the row and collapse and 
//expend all the rows depending on the current state of the row:    
    function collapse_exand_rows(){
        var table_length = $('#example tbody tr').length;
        for (var i = 0; i < table_length; i++) {
            var tr = $('.details-control').parents('tr').eq(i);
            var row = table.row( tr );
            if(!tr.hasClass('visited_child') || visited_cehck != 1){
                if ( isCollapse === 1 ) {
                    // This row is already open - close it
                    row.child.hide();
                    tr.removeClass('shown');
                }
                else {
                    // Open this row
                    row.child( format(row.data()) ).show();
                    tr.addClass('shown');
                }   
            }
        }
    }

//This event handles click for on each child row to show and hide rows.
    $('#example tbody').on('click', 'td.details-control', function () {
        var tr = $(this).parents('tr');
        var row = table.row( tr );
        visited_cehck = 1;
        tr.addClass('visited_child');
        if ( row.child.isShown() ) {
            // This row is already open - close it
            row.child.hide();
            tr.removeClass('shown');
        }
        else {
            // Open this row
            row.child( format(row.data()) ).show();
            tr.addClass('shown');
        }
    } );

//This event handles navigation bar below the report to show and hide all the visible rows
    $('.dataTables_paginate').bind('click', '.details-control', function(event) {   
        if(visited_cehck === 1){
            return false;
        }
        collapse_exand_rows();
    });

//This event handles collapse expand button click to show and hide all the visible rows
    $('#collapse_expand').on('click', function(event) {
        visited_cehck = 0;
        if(isCollapse === 1){
            $('#collapse_expand').text('Collapse All');
            isCollapse = 0; 
        }
        else{
            $('#collapse_expand').text('Expand All');
            isCollapse = 1;
        }
        collapse_exand_rows();
    });

//This event handles dropdown to show and hide all the visible rows
    $('select').on('change', function (event) {
        collapse_exand_rows();  
    });

    $("thead > tr", '#example').click(function(event) {
        collapse_exand_rows();  
    })

    $(':input').change(function(event) {
        collapse_exand_rows();  
    });
});
</script>

答案 1 :(得分:0)

做这样的事情:

var table_length = $("#mastertable tr").length;
var paginate_button = $('.paginate_button');
for(var i = 0; i< table_length; i++){
    var tr = $('#mastertable tbody td.details-control').eq(i).parents('tr');
    var row = table.row(tr);
     row.child( format(row.data()) ).show();
    tr.addClass('shown');
}

如果你有分页:

isCollapse === 0
paginate_button.on('click',function(){
    table_length = $("#example tr").length;
    if ( isCollapse === 1 ) {
          for(var i = 0; i< table_length; i++){
                var tr = $('#example tbody td.details-control').eq(i).parents('tr');
                var row = table.row(tr);
                row.child.hide();
                tr.removeClass('shown');
             }
       }
    else {
        // Open this row
        for(var i = 0; i< table_length; i++){
             var tr = $('#example tbody td.details-control').eq(i).parents('tr');
            var row = table.row(tr);
            row.child( format(row.data()) ).show();
            tr.addClass('shown');
        }
    }       
        });