数据表添加多个子行

时间:2014-12-12 09:16:46

标签: javascript jquery datatables jquery-datatables

我有一个连接到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>"

3 个答案:

答案 0 :(得分:4)

如果要保留数据源的数据属性,可以执行以下操作

&#13;
&#13;
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');
          }
      });
  });
&#13;
 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;
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

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;
}

现在只需在自定义属性<tr data-child-index="1">

中添加数组的索引

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

编辑:不需要更改HTML。

使用jQuery index()

动态计算索引

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

DEMO

答案 2 :(得分:0)

如果要将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;
}