【问题标题】:JQuery Datatable with parent child relationship in same dataset. How to display it as parent child rows in the table?同一数据集中具有父子关系的 JQuery 数据表。如何在表格中将其显示为父子行?
【发布时间】:2016-01-06 15:03:11
【问题描述】:

我有一个嵌套数据集。数据集中很少有记录是同一数据集中其他记录的子记录。父元素为 null 的记录没有任何子元素,但具有关联值的记录将在同一数据集中指示其父元素。如何在具有父子关系的 jQuery 数据表中表示这一点。

我刚刚处理了通用数据集来解释我的要求。在下面的数据集示例中,带有名称的记录 - Tiger Nixon 有两个子记录,它们是同一数据集中的单独记录。

如何实现的示例将有很大帮助。

{
  "data": [
    {
      "name": "Tiger Nixon",
      "parent": "null",
      "position": "System Architect",
      "salary": "$320,800",
      "start_date": "2011/04/25",
      "office": "Edinburgh",
      "extn": "5421"
    },
    {
      "name": "Garrett Winters",
      "parent": "Tiger Nixon",
      "position": "Accountant",
      "salary": "$170,750",
      "start_date": "2011/07/25",
      "office": "Tokyo",
      "extn": "8422"
    },
    {
      "name": "Ashton Cox",
      "parent": "null",
      "position": "Junior Technical Author",
      "salary": "$86,000",
      "start_date": "2009/01/12",
      "office": "San Francisco",
      "extn": "1562"
    },
    {
      "name": "Cedric Kelly",
      "parent": "Tiger Nixon",
      "position": "Senior Javascript Developer",
      "salary": "$433,060",
      "start_date": "2012/03/29",
      "office": "Edinburgh",
      "extn": "6224"
    }
]
}

【问题讨论】:

    标签: jquery datatable datatables parent


    【解决方案1】:

    解决方案

    您可以使用ajax.dataSrc 将原始数据存储在g_dataFull 中,并过滤并返回包含仅显示在主表中的父级的数据。

    当子行位于format() 函数中时,您需要迭代完整数据集g_dataFull 并查找并显示包含子行的行 (this.parent === d.name)。

    演示

    var g_dataFull = [];
    
    /* Formatting function for row details - modify as you need */
    function format ( d ) {
        var html = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;" width="100%">';
          
        var dataChild = [];
        var hasChildren = false;
        $.each(g_dataFull, function(){
           if(this.parent === d.name){
              html += 
                '<tr><td>' + $('<div>').text(this.name).html() + '</td>' + 
                '<td>' +  $('<div>').text(this.position).html() + '</td>' + 
                '<td>' +  $('<div>').text(this.office).html() +'</td>' + 
                '<td>' +  $('<div>').text(this.salary).html() + '</td></tr>';
             
              hasChildren = true;
           }
        });
      
        if(!hasChildren){
            html += '<tr><td>There are no items in this view.</td></tr>';
         
        }
      
     
        html += '</table>';
        return html;
    }
     
    $(document).ready(function() {
        var table = $('#example').DataTable( {
            "ajax": {
              "url": "https://api.myjson.com/bins/3mbye",
              "dataSrc": function(d){
                
                 g_dataFull = d.data;
                 var dataParent = []
                 $.each(d.data, function(){
                    if(this.parent === "null"){
                       dataParent.push(this);  
                    }
                 });
                
                 return dataParent;
              }
            },
             
            "columns": [
                {
                    "className":      'details-control',
                    "orderable":      false,
                    "data":           null,
                    "defaultContent": ''
                },
                { "data": "name" },
                { "data": "position" },
                { "data": "office" },
                { "data": "salary" }
            ],
            "order": [[1, 'asc']]
        } );
         
        // Add event listener for opening and closing details
        $('#example tbody').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(row.data()) ).show();
                tr.addClass('shown');
            }
        } );
    } );
    td.details-control {
        background: url('https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_open.png') no-repeat center center;
        cursor: pointer;
    }
    tr.shown td.details-control {
        background: url('https://raw.githubusercontent.com/DataTables/DataTables/1.10.7/examples/resources/details_close.png') no-repeat center center;
    }
    <link href="//cdn.datatables.net/1.10.7/css/jquery.dataTables.min.css" rel="stylesheet" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <script src="//cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js"></script>
    
    <table id="example" class="display">
    <thead>
        <tr>
            <th></th>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Salary</th>
        </tr>
    </thead>
    
    <tfoot>
        <tr>
            <th></th>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Salary</th>
        </tr>
    </tfoot>
    </table>

    【讨论】:

    • 非常感谢,它成功了。我可以知道如何将搜索父行和子行一起添加。
    • 优秀。这真的很有帮助。有谁知道如何让子列与父列对齐?
    • 看起来子行在 内显示了一个 。我只想在父表的其中一行中显示该子行,以便一切都正确排列。
    • 如何在页面加载时默认展开所有行,我试过这个但没有运气$("#example").DataTable().rows().every(function () { var tr = $(this.node()); this.child(format(tr.data('child-value'))).show(); tr.addClass('shown'); });
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多