QA@IT

DataTablesで、drawCallbackの中で、表示されているレコードだけを取得したい。

8895 PV

DataTablesのバージョン1.10.3、jQueryのv2.1.1 の組み合わせで使用しています。
DataTablesで、searchなどでフィルタ処理を行った後に、表示内容を加工するサンプルを作成しようとしています。

DataTablesのdrawを呼び出した後に、drawCallbackで定義した関数が呼び出されます。
この時、レコードが表示するか非表示かで、処理を分岐しようと考えました。

こういった感じのソースになるはずです。

    var table = $('#dummyTable').DataTable(
      {
        searching: true
        ,"drawCallback": function( settings )
        {
          var api = this.api();
          var row = api.rows();
          var rowsNodes = api.rows().nodes();

          api.column().data().each( function ( columnValue, i ) { //全てのレコードに処理を行う
            var rowNode = $(rowsNodes).eq(i);

            if(rowsNodes.row(i).child.isShown()){
              console.log('表示するってさ');
            }else{
              console.log('表示しないってさ');
            }
          }
        }
      });

ところが上記のソースは、全てのレコードで「表示しないってさ」と出力されてしまうのです。
isShownのリファレンスを見ると、恐らくrowオブジェクト?(という言い方が正しいか解りませんが)を取得しないと、動作しないようでした。
http://datatables.net/reference/api/row().child.isShown()
つまり、rowsにはこのメソッドはなく、isShownでは表示の状態は判別できないみたいなんです。

どうにかして、表示するレコード、非表示のレコードで処理を分岐したいのですが、どなたか良い方法をご存じないでしょうか?

回答

別々に各行を取得する方法でよければ、以下の様なやり方はあるみたいです。

    var table = $('#dummyTable').DataTable(
      {
        searching: true
        ,"drawCallback": function( settings )
        {
          var api = this.api();
          var row = api.rows();
          var rowsNodes = api.rows().nodes();

          var rows = this.$('tr', {"filter":"applied"});
            rows.each(function(index, el){ 
              console.log("表示される");
              console.log(el);});

          rows = this.$('tr', {"filter":"not applied"});
            rows.each(function(index, el){ 
              console.log("表示されない");
              console.log(el);});
        }
   });

"not applied"の指定の仕方が間違っているかもしれません。
( "applied" は公式に指定されているの見かけましたが、反対の指定方法を見かけなかったのでやってみたら期待される側が取れたという感じです)

編集 履歴 (0)
  • やはり同じ取得方法ではできないようなのですね。
    結局の所、元データと表示されているTRタグを別々に取得して、
    一つ一つ属性をチェックして、元データと表示内容を比較するという方法に落ち着きました…。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。