2017-09-11 9 views
0

私は、ユーザーが確認した内容に基づいて列をフィルタリングすることができるdataTableを持っています。ロード後のjQuery DataTablesボタントリガーは無限ループになります

私は、ユーザーが現在dataTableに表示されているものをエクスポートできるようにしたいと考えています。ですから、チェックボックスの有無に応じて、どの列を表示するか隠すべきかを知ることができるように、各チェックボックスにはdata-columnという属性があります。

私はこのように私のテーブルを初期化しています

var table = $('.my-table').DataTable({ 
     pageLength:25, 
     fixedHeader: true, 
     sScrollX: true, 
     dom: '<"html5buttons"B>lTfgitp', 
     buttons: [ 
      {extend: 'copy'}, 
      {extend: 'csv', 
       title: 'Testing', 
       exportOptions: { 
        columns: get_columns_to_export(), 
        rows: { selected: true } 
       }, 
       'customize': function(doc){ 
        console.log("==CSV DOC=="); 
        console.log(doc); 
       } 
      }, 
      {extend: 'excel', 
       title: 'Testing', 
       exportOptions: { 
        columns: get_columns_to_export(), 
        rows: { selected: true } 
       }, 
       'customize': function(doc){ 
        console.log("==EXCEL DOC=="); 
        var sheet = doc.xl.worksheets['sheet1.xml']; 
        console.log(sheet); 
       } 
      }, 
      {extend: 'print', 
       customize: function (win){ 
        $(win.document.body).addClass('white-bg'); 
        $(win.document.body).css('font-size', '10px'); 

        $(win.document.body).find('table') 
          .addClass('compact') 
          .css('font-size', 'inherit'); 
       } 
      } 
     ] 
}); 

機能get_columns_to_exportだけ表示されている列の番号付きリストを返し、これは実際にだけ、ページの読み込みで、動作します。

私はいくつかの列を再表示する場合(get_columns_to_export()余分な数を含む異なる配列を返すように)、エクスポートされたファイルのみがテーブル負荷に見つかった元の列を含むことになります。

ボタンを再度トリガする方法を調べましたが、JSのスタックサイズが足りなくなる前にDataTablesが無限ループする問題が発生しています。 DataTableのドキュメントから

は、私がbutton.trigger()を使用していることは、以下でhereが見つかりました:

$('.buttons-excel').on('click',function(){ 
    table.button('.buttons-excel').trigger(); 
}); 

これは、無限ループが発生します。私はまた、returnステートメントをトリガアクションの後に追加しようとしましたが、何らかの理由でこれを無視し、元の宣言で宣言した元のcustomize関数に直接入ります。tableです。

DataTableを無限ループで終わらないうちに正しい列番号で更新するにはどうすればよいですか? exportOptionsセクション

答えて

1

変更は

exportOptions: { 
        columns: get_columns_to_export.bind(this), 
        rows: { selected: true } 
       }, 

のDataTableの列セレクタは、それらの間で、文字列または関数を様々なオプションを取ることができなければ。

元の例では、コンパイル時にget_columns_to_export()関数を呼び出しています。この関数は、列セレクタに割り当てられている列の初期状態を返します。

列が動的なので、ボタンアクションが実行されるたびに呼び出される列セレクタの関数形式を使用する必要があります。

トリガ機能によって呼び出されたクリック機能のボタンをトリガしているため、無限ループが発生しています。これを取り除いてループを止めてください。

+0

これは機能します!これを回避する方法がないかどうかはわかりませんが、 'exportOptions'を更新すると、すべての単一行に対して' get_columns_to_export'が呼び出されます。列の量はすべての行で変化しないので、各行に対して関数を繰り返し呼び出す方法がありますか? – Alex

関連する問題