1

この質問と似ているが同じではないクエリがあります。

違いは、列ではなく行のデータ属性でフィルタリングしようとしていることです。要素ではtrなく、td要素。これには主キーが含まれており、重複を削除しようとしています。重複行は実際の列データが異なる場合があるため、そのようにすることはできません。キーは、アンダースコアで区切られた 3 つの数値フィールドの組み合わせです。

<tr data-primarykey="12345678_12_34"><td>... 

次に、javascriptページの読み込み時に呼び出される関数内で...

  var rows = [];
  $.fn.DataTable.ext.search.push(
    function( settings, data, dataIndex, rowObj, counter ) {
      if(counter === 0) rows = [];

      // I want rowkey to be the data-primarykey attribute of the tr element
      var rowkey = table.row(dataIndex).data('primarykey');

      // If we've seen the row before (already in the array), filter it out.
      // Otherwise, return true and add it to the array
      if ($.inArray(rowkey,rows) > -1) return false;
      else {
        rows.push(rowkey);
        return true;
      }
    }
  );

問題の一部は、tableオブジェクトがどこにも定義されていないことだと思います。このフィルターは複数のテーブルに適用されるため、可能であれば、現在フィルター処理されているテーブルである必要があります。各テーブルには固有の がありますが、属性idを共有しています。class

2016/12/12更新

実際のデータ属性を使用するバージョンで、ある程度の進歩を遂げました。このバージョンには動作するtableDataTable オブジェクトがあり、行を正しく取得して jquery に変換すると思います。ただし、data-attribute を取得しようとすると、undefined.

$.fn.DataTable.ext.search.push(
    function( settings, data, dataIndex, rowObj, counter ) {
      if(counter === 0) rowkeys = [];

      // I want rowkey to be the data-primarykey attribute of the tr element
      var tableID = $(settings.nTable).attr("id");
      var table = $('#'.tableID).DataTable(); // Correct DataTable
      //var row = table.rows(dataIndex).nodes().to$(); // Correct row?
      var rowkey = table.rows(dataIndex).nodes().to$().data("primarykey");
      console.log('key: '+rowkey); // Shows 'key: undefined' in console.

      // If we've seen the row before (already in the array), filter it out.
      // Otherwise, return true and add it to the array
      if ($.inArray(rowkey,rowkeys) > -1) return false;
      else {
        rowkeys.push(rowkey);
        return true;
      }
    }
  );   
4

2 に答える 2

2

このフィルターは複数のテーブルに適用されるため、可能であれば、現在フィルター処理されているテーブルである必要があります。各テーブルには一意の ID がありますが、クラス属性を共有しています。

if指定したテーブルのみでフィルターが機能するように制限するには、チェックを付ける必要があります。

 if (settings.nTable.id === "yourTableId" || settings.nTable.id === "anotherTableId") { 

 }

ifでチェックを行うこともできますclass

if ($(settings.nTable).hasClass('yourClass')) { 

}

// rowkey を tr 要素の data-primarykey 属性にしたい

settingsコールバックの変数でそれを取得し、counter変数も組み合わせて使用​​ できます。

ここに画像の説明を入力

だから、あなたがする必要があるのは、この行を持つことだけです

var rowkey = $(settings.aoData[counter].nTr).data('primarykey');

これは、このフィルター ロジックを使用する実際の例です。

filter: 上記の例には静的な HTML テーブルがありますが、これはロジックに集中しているため、問題ではないと思います。また、フィルターは、検索ボックスに何かを入力した場合にのみ機能します。

したがって、最終的なロジックは次のようになります

var rows = [];

$.fn.dataTableExt.afnFiltering.push(
  function(settings, data, dataIndex, rowObj, counter) {
    if (settings.nTable.id === "yourTableId") {   // change (1)
      if (counter === 0) rows = [];

      // I want rowkey to be the data-primarykey attribute of the tr element
      var rowkey = $(settings.aoData[counter].nTr).data('primarykey'); // change (2)

      // If we've seen the row before (already in the array), filter it out.
      // Otherwise, return true and add it to the array
      if ($.inArray(rowkey, rows) > -1) return false;
      else {
        rows.push(rowkey);
        return true;
      }
    }
  }
);
于 2016-12-15T13:30:16.613 に答える
0

これをデバッグする私の努力は、返された行をテーブルに追加<tr>し、結果で検出された場合は再描画するだけの ajax 関数によって妨げられました。ただし、開口部を変更したため、<tr data-primarykey="...">一致することはなく、行が再描画されることはなく、フィルター関数が呼び出されることはありませんでした。

これを修正すると、エラー メッセージが表示されるようになりました。このエラーに関するRequested unknown parameter '10' for row 0.DataTables のドキュメントを調べても、それほど賢明ではありませんでした。

data-属性を使用せずにキーをフィルタリングできるようにする回避策を作成しました。キーのデータテーブルに追加の列を追加し、この列のthおよびtd要素に をcss持つスタイルを与えましたdisplay: none;。次に、この列の重複を次のようにフィルタリングしました...

var rowkeys = [];

$.fn.DataTable.ext.search.push(
    function( settings, data, dataIndex, rowObj, counter ) {
      if(counter === 0) rowkeys = [];
      // I want rowkey to be the data-primarykey attribute of the tr element
      var rowkey = data[11] || '';

      // If we've seen the row before (already in the array), filter it out.
      // Otherwise, return true and add it to the array
      if ($.inArray(rowkey,rowkeys) > -1) return false;
      else {
        rowkeys.push(rowkey);
        return true;
      }
    }
);

この回答は私の問題を解決し、誰かが同様のことをしようとするための良い回避策として役立つかもしれませんが、この質問に対する適切な回答は、でを使用しdata-attributeますtr

于 2016-12-08T09:36:58.590 に答える