2016-09-24 53 views
0

这里是所有的代码。在'点击'不发射/寻找数据子行打开

@model IEnumerable<Arb.Models.Fixture> 

@{ 
    ViewBag.Title = "Fixtures"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<table id="fixtures" class="table table-bordered table-hover"> 
    <thead> 
     <tr> 
      <th></th> 
      <th>Fixture</th> 
      <th>Date/Time</th> 
      <th>Market</th> 
      <th>Selection</th> 
      <th>Bookie</th> 
      <th>Coupon</th> 
      <th>Back</th> 
      <th>Lay</th> 
      <th>Size</th> 
      <th>Percent</th> 
     </tr> 
    </thead> 
    <tbody></tbody> 
</table> 

@section scripts 
{ 
<style type="text/css" class="init"> 
td.details-control { 
    background: url('http://next.datatables.net/examples/resources/details_open.png') no-repeat center center; 
    cursor: pointer; 
} 
tr.shown td.details-control { 
    background: url('http://next.datatables.net/examples/resources/details_close.png') no-repeat center center; 
} 
</style> 

    <script> 

     /* Formatting function for row details - modify as you need */ 
     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 name:</td>' + 
        '<td>' + d.name + '</td>' + 
       '</tr>' + 
       '<tr>' + 
        '<td>Extension number:</td>' + 
        '<td>' + d.extn + '</td>' + 
       '</tr>' + 
       '<tr>' + 
        '<td>Extra info:</td>' + 
        '<td>And any further details here (images etc)...</td>' + 
       '</tr>' + 
      '</table>'; 
     } 

     $(document).ready(function() { 
      var fixtureTable = $('#fixtures').DataTable({ 
       ajax: { 
        url: "/api/fixtures", 
        dataSrc: "" 
       }, 
       columns: [ 
        { 
         "className": 'details-control', 
         "orderable": false, 
         "data": null, 
         "defaultContent": '' 
        }, 
        { 
         data: "eventName", 
         render: function (data, type, fixture) { 
          return "<a href='/fixtures/edit/" + fixture.id + "'>" + fixture.eventName + "</a>"; 
         } 
        }, 
        { 
         data: 'eventDateTime', 
         render: function (data, type, row) { 
          var d = new Date(data); 
          return d.getDate() + '-' + ('0' + d.getMonth()).slice(-2) + ' ' + ('0' + d.getHours()).slice(-2) + ':' + ('0' + d.getMinutes()).slice(-2); 
         } 
        }, 
        { data: 'marketName' }, 
        { data: 'selectionName' }, 
        { data: 'bookmakerName' }, 
        { data: 'couponName' }, 
        { 
         data: 'backOdds', 
         render: $.fn.dataTable.render.number(',', '.', 2) 
        }, 
        { 
         data: 'exchangeType.layOdds', 
         render: $.fn.dataTable.render.number(',', '.', 2) 
        }, 

        { 
         data: 'exchangeType.size', 
         render: $.fn.dataTable.render.number('', '.', 0, '£') 
        }, 
        { 
         data: null, 
         render: function (data, type, row) { 
          return Math.round((row.backOdds/row.exchangeType.layOdds) * 100 - 100) + '%'; 
         } 
        } 
       ], 
       "order": [[1, 'asc']] 
      }); 
      setInterval(function() { 
       fixtureTable.ajax.reload(null, false); // user paging is not reset on reload 

       var currentTime = new Date().toLocaleTimeString('en-GB', { 
        hour: "numeric", 
        minute: "numeric", 
        second: "numeric" 
       }); 

       var currentDate = new Date(); 

       var datetime = "Last Updated: " + currentDate.getDate() + "/" + (currentDate.getMonth() + 1) 
       + "/" + currentDate.getFullYear() + " " + currentTime; 
       $("#UpdateTime").text(datetime); 
      }, 10000); 

      // Add event listener for opening and closing details 

      $('#fixtures 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'); 
       } 
      }); 
     }); 
    </script> 
} 

有一件事我注意到的是,有时,但并不总是它显示“选择td.details控制已经被先前指定”。但是,当我寻找任何早期的定义,包括全局搜索或注释代码 - 错误仍然出现。 enter image description here IDK,如果这是一个红色的鲱鱼,但它不会以某种方式获得子行。

这就是我想实现https://datatables.net/examples/api/row_details.html

+0

你能为你的代码创建一个小提琴吗? –

回答

1

我看到以下可能的错误:

  1. 使用Ajax更新 - 你TBODY将重新建立,因此您的活动将无法正常工作(尝试使用$('#fixtures').on('click', 'tbody td.details-control', ...

  2. var row = table.row(tr); - 应该是var row = fixtureTable.row(tr);

+0

2号工作非常漂亮 - 非常感谢你kva - 你不知道救了我多少钱! 现在唯一的问题是10秒钟自动刷新正在关闭子行,当它在数据表刷新时打开时。 有没有办法阻止 - 保持自动刷新没有打开子行关闭? 或者我在这种情况下期望太多,它正在工作,因为它应该是,这是刷新的本质? – user6063812

+0

似乎为孩子行状态(隐藏与否)不会保存在ajax之间重新加载。 不过你可以试试这个: 1.前阿贾克斯重载 - 保存打开的孩子 与回调(第一参数)2.调用AJAX重装 [链接](https://datatables.net/reference/api/ajax.reload( )) 在回调函数 - 恢复打开的孩子(使用保存的信息) – kva