【问题标题】:Datatables add multiple child-rows数据表添加多个子行
【发布时间】:2014-12-12 09:16:45
【问题描述】:

我有一个连接到 jQuery 数据表的表。基于此example 我想添加“隐藏”子行以显示额外信息。

我有以下jsfiddle,其中有一个名称/值对。

<tr data-child-name="Name1" data-child-value="Value 1">
    <td class="details-control"></td>
function format ( name, value ) {
    return '<div>' + name + ': '+ value + '</div>';
}

$(document).ready(function () {
    var table = $('#example').DataTable({});

    // Add event listener for opening and closing details
    $('#example').on('click', 'td.details-control', function () {
        var tr = $(this).closest('tr');
        var row = table.row(tr);

        if (row.child.isShown()) {
            // This row is already open - close it
            row.child.hide();
            tr.removeClass('shown');
        } else {
            // Open this row
            row.child( format(tr.data('child-name'), tr.data('child-value') )).show();
            tr.addClass('shown');
        }
    });
});

我的问题是如何添加多个名称/值对?这样我就可以像在 datatables.net 示例中那样定义各种行。

我的源代码是一个 php 脚本,它可以像 jsfiddle 示例一样生成 html。

这可能是一项简单的任务,但我的 jQuery 技能非常有限 :-)

谢谢。

更新: 数据来自一个 ldap 查询:

$ldapResults[$i]
echo "<td>" . utf8_encode($ldapResults[$i]['sn'][0]) . "</td>"

【问题讨论】:

    标签: javascript jquery datatables jquery-datatables


    【解决方案1】:

    如果你想为你的数据源保留数据属性,你可以这样做

    function format ( dataSource ) {
        var html = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
        for (var key in dataSource){
            html += '<tr>'+
                       '<td>' + key             +'</td>'+
                       '<td>' + dataSource[key] +'</td>'+
                    '</tr>';
        }        
        return html += '</table>';  
    }
    
    $(function () {
    
          var table = $('#example').DataTable({});
    
          // Add event listener for opening and closing details
          $('#example').on('click', 'td.details-control', function () {
              var tr = $(this).closest('tr');
              var row = table.row(tr);
    
              if (row.child.isShown()) {
                  // This row is already open - close it
                  row.child.hide();
                  tr.removeClass('shown');
              } else {
                  // Open this row
                  row.child(format({
                      'Key 1' : tr.data('key-1'),
                      'Key 2' :  tr.data('key-2')
                  })).show();
                  tr.addClass('shown');
              }
          });
      });
     td.details-control {
        background: url('http://www.datatables.net/examples/resources/details_open.png') no-repeat center center;
        cursor: pointer;
    }
    tr.shown td.details-control {
        background: url('http://www.datatables.net/examples/resources/details_close.png') no-repeat center center;
    }
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script src="http://cdn.datatables.net/responsive/1.0.1/js/dataTables.responsive.min.js"></script>
    <script src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script>
    <link rel="stylesheet" href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.css" />
    
    <table id="example" class="display nowrap" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th></th>
                <th>Item 1</th>
                <th>Item 2</th>
                <th>Item 3</th>
                <th>Item 4</th>
            </tr>
        </thead>
        <tbody>
            <tr data-key-1="Value 1" data-key-2="Value 2">
                <td class="details-control"></td>
                <td>data 1a</td>
                <td>data 1b</td>
                <td>data 1c</td>
                <td>data 1d</td>
            </tr>
            <tr data-key-1="Value 1" data-key-2="Value 2">
                <td class="details-control"></td>
                <td>data 2a</td>
                <td>data 2b</td>
                <td>data 2c</td>
                <td>data 2d</td>
            </tr>
        </tbody>
    </table>

    【讨论】:

    • @Freeez 嗨,谢谢你——还有一个问题:如果你想要另一个孩子怎么办?
    • @BKSpureon 你能说得更具体些吗?
    • 谢谢你,我的意思是,如果你想要一个子标题中的一个子标题显示一堆记录(而不是列出键值巴黎)?
    • @BKSpureon 您设法在子行中添加子行,我希望这样做吗?
    • @JohnDoe 已经五年了!我不记得原始代码:P,但可以肯定可以找到某种解决方案
    【解决方案2】:

    您可以为每一行创建一个需要显示的数据数组

    EG:

    var data = [
      { key1 :'value1', key2 :'value2', key3 :'value3'}, //Row1
      { key1 :'value1', key2 :'value2'} //Row2
    ];
    

    并更新了format()

    function format (index ) {
      var json_data =  data[parseInt(index)];
      var op = '';
      $.each(json_data, function(key, value){
        op +='<div>' + key + ': '+ value + '</div>';
      });
      return op;
    }
    

    现在只需在自定义属性&lt;tr data-child-index="1"&gt;中添加数组的索引

    最后是row.child(format(tr.data('child-index'))).show();

    编辑:无需更改 html。

    使用jQuery index()动态计算索引

    row.child(format($('#example td.details-control').index($(this)))).show();

    DEMO

    【讨论】:

    • 数据来自 ldap 查询: $ldapResults[$i] echo "" 。 utf8_encode($ldapResults[$i]['sn'][0]) 。 "" 我暂时无法修改。
    • 我不明白。那么上面的代码中哪些是你不能编辑的??
    【解决方案3】:

    如果正在获取 json 数据以显示为子项,请尝试,

    else {
        // Open this row
        // pass your json data to show in details
        row.child( format(myJsonData)).show();
        tr.addClass('shown');
    }
    

    并在格式函数中更改它,

    function format ( json ) {
        var $json=$.parseJSON(json);// if not parsed
        var str='';
        $json.each(function(key,value){
           str += '<div>'+key+':'+value+'</div>';
        });
        return str;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多