2016-04-12 2 views
1

ウェブページの作成にjQuery DataTableを使用しています。私はすでにテーブルが作成された状態でページが開かれるユースケースを持っています。さて、ページにはいくつかのフィルタを置いてテーブルを更新できるフォームがあります。さらに重要なのは、各行に対して、私はexplained hereというように詳細を見ることができます。破棄および再ロード後に行を展開できません。未定義のプロパティ '_detailsS​​how'を読み取ることはできません。

私の場合、フォームが送信された後にデータが再ロードされるとすぐに、各データ行を展開する詳細ボタンが機能しなくなります。それは次のエラーを与える:

jquery.dataTables.min.js:120キャッチされない例外TypeError:プロパティを読み取ることができません「_detailsS​​how」未定義

の私は、最初のクリアによってあなたのテーブルをリロード破壊して、DataTableのメソッドを呼び出しています。ここに私のコードだ:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 

    <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.11/css/jquery.dataTables.min.css"> 
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.1.2/css/select.dataTables.min.css"> 
    <link rel="stylesheet" type="text/css" href="../../../static/css/chosen/bootstrap-chosen.css"> 

    <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.1.min.js"></script> 
    <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> 
    <script type="text/javascript" src="../../../static/js/bootstrap/bootstrap-datetimepicker.min.js"></script> 
    <script type="text/javascript" src="https://cdn.datatables.net/1.10.11/js/jquery.dataTables.min.js"></script> 
    <script type="text/javascript" src="https://cdn.datatables.net/select/1.1.2/js/dataTables.select.min.js"></script> 
    <script type="text/javascript" src="https://cdn.datatables.net/1.10.11/js/dataTables.bootstrap.min.js"></script> 

    <script type="text/javascript"> 

     $(document).ready(
       function() 
       { 
        var dashboard_table_id = "#example"; 

        function destroy_existing_data_table() 
        { 
         var existing_table = $(dashboard_table_id).dataTable(); 
         if (existing_table != undefined) 
         { 
          existing_table.fnClearTable(); 
          existing_table.fnDestroy(); 
         } 
        } 

        function create_dashboard_table() 
        { 
         var data_table = $(dashboard_table_id).DataTable({ 
          "data": [{ 
           "dt_RowId": 10, 
           "column1": "delhivery", 
           "column2": "CRP12345", 
           "column3": "1122", 
           "column4": "One expanded row" 
          }, { 
           "dt_RowId": 2, 
           "column1": "delhivery", 
           "column2": "CRP12345", 
           "column3": "1122", 
           "column4": "Other expanded row" 
          }], 
          "columns": [ 
           {"className": "select-checkbox", orderable: false, "data": null, "defaultContent": ""}, 
           {"class": "details-control", "orderable": false, "data": null, "defaultContent": ""}, 
           {"data": "column1"}, 
           {"data": "column2"}, 
           {"data": "column3"} 
          ], 
          "buttons": {}, 
          "dom": 'lBfrtip', 
          "select": { 
           "style": 'multi', 
           "selector": 'td:first-child' 
          }, 
          "oLanguage": {"sSearch": ""}, 
          "order": [[2, 'asc']], 
          "bLengthChange": false, 
          "pageLength": 25 
         }); 

         // adding event listener for opening and closing details 
         $(dashboard_table_id).find('tbody').on('click', 'tr td.details-control', 
           function() 
           { 
            var tableRow = $(this).closest('tr'); 
            var row = data_table.row(tableRow); 

            if (row.child.isShown()) 
            { 
             tableRow.removeClass('details'); 
             row.child.hide(); 
            } 
            else 
            { 
             var rowData = row.data(); 
             tableRow.addClass('details'); 
             row.child("Hello there, this is the expanded view I am referring to....").show(); 
            } 
           }); 
        } 

        $("#example-form-submit").click(function (event) 
        { 
         event.preventDefault(); 
         destroy_existing_data_table(); 
         create_dashboard_table(); 
        }); 

        create_dashboard_table(); 
       }); 

    </script> 
    <style>td.details-control { 
     background: green; 
     cursor: pointer; 
    } 

    tr.details td.details-control { 
     background: blue; 
    }</style> 
</head> 
<body> 
<div class="main-content lfloat"> 
    <div class="container" style="width: 100%;"> 

     <label for="example-form-submit" class="col-md-2 control-label"></label> 
     <div class="col-md-2"> 
      <button type="submit" id="example-form-submit" class="btn btn-primary">Refresh and try to expand</button> 
     </div> 

     <div> 
      <table id="example" class="row-border hover order-column" cellspacing="0" width="100%"> 
       <thead> 
       <tr> 
        <th></th> 
        <th></th> 
        <th>column1</th> 
        <th>column2</th> 
        <th>column3</th> 
       </tr> 
       </thead> 
      </table> 
     </div> 
    </div> 
</div> 
</body> 

</html> 

いくつかのいずれかは、私が間違ってやっているものを指摘してくださいすることができます。ありがとうございました。これはしばらくの間私を悩ませています。

JSFiddle:クレジット:@Edis Golubich

+0

@Edis Golubichのために働く:それはそこも再現可能です。緑色のボタンをクリックしてください。行が拡大するのがわかります。今すぐ上のボタンをクリックしてください。緑色のボタンをもう一度クリックします。それは拡大しません。 – OneMoreError

+0

私の悪いです。間違った問題を探していた。 –

+0

問題ありません。助けをよろしくお願いします:) – OneMoreError

答えて

0

問題は、委任されたイベント処理を経てjQuery.on()を使用した場合data_tableオブジェクトが '更新' の取得されていないということです。

これを試してみてください:https://jsfiddle.net/f5mdcrup/4/

私がやったことは、機能のdata_table外を宣言しました。この場合、スコープは異なります。

+0

[送信]ボタンをクリックする前でもクリックして行を展開することができません。 – OneMoreError

+0

@OneMoreErrorは別の問題でした。あなたは関数内に.on()を持っていて、get関数が呼び出されると同時に複数回呼び出されています。同じイベントハンドラを繰り返し追加する:)リンクを更新しました。 PS:それは私の間で警告があったので私のために働いた。それはあなたのためにしなかった理由です投稿する前にestaticsのためにそれを削除しました。 PPS:私はこれを前に見たことがあります:P –

+0

@Edis:Plunkerはクールだけど、別の問題に直面しています。「Referesh and Expand to」ボタンをクリックしています。私は拡張状態を緩めたくありません。ヘルプ、ありがとう.. –

0

それは私のために働く。最新のクリックイベントハンドラを削除してから、新しいものを追加してください。

$(dashboard_table_id).find('tbody').off('click', 'tr td.details-control'); 
$(dashboard_table_id).find('tbody').on('click', 'tr td.details-control',function(){...}); 
0

次のコードは、私

$(dashboard_table_id).find('tbody').off('click', 'tr td.details-control'); 
$(dashboard_table_id).find('tbody').on('click', 'tr td.details-control',function(){ 
//Action To perform 
}); 
関連する問題