2013-03-02 17 views
7

私はデータを表示するためにdatatableを使用しています。私たちは皆知っているように、データテーブル自体でソートとフィルタリングを行うことができます。しかし、データテーブルのソートフィールドに1文字を入力すると、データの検索が始まりますが、必要ありません。ユーザーが少なくとも3文字をフィールドに入力したときにのみデータを検索する必要があります。それは可能ですか..?もしそうなら、どんな方法で?あなたのコメントをお寄せください。primefacesデータテーブル内でソートする

ありがとうございます。

+0

私が見てきたことから、テーブル全体を検証するか、PFデータテーブルのソースを少し変更して再コンパイルするかの選択肢があります。あなたはどちらを実行しますか? – kolossus

+0

@kolossus:私の問題のためにデータテーブルのソースコードからいくつかのメソッドをオーバーライドすればOKです。 PFがdatatableバージョンを進めるなら、それは私の頭上にはならないはずです。 – Arun

+0

@kolossus PFデータテーブルのソースを少し変更するためのソリューションを提供できますか? – tylerdurden

答えて

4

私はPrimefacesのデータテーブルを少し調べましたが、ここに私の発見があります。

実際には、再コンパイルは必要ありません。ソースのJavaScript置換も同様です。

Primefaceによって提供されるイベントの代わりにフィルタイベント用の新しいハンドラを登録する必要があります。この場合

データテーブルは次のように使用されます。

<h:outputScript name="js/customprimefacestable.js" target="body"/> 

<p:dataTable var="data" value="#{filterBean.data}" filteredValue="#{filterBean.filteredData}" widgetVar="tableWidget"> 
    <p:column filterBy="#{data.name}" headerText="Name" filterMatchMode="contains"> 
     <h:outputText value="#{data.name}" /> 
    </p:column> 
    <p:column filterBy="#{data.value}" headerText="Value" filterMatchMode="contains"> 
     <h:outputText value="#{data.value}" /> 
    </p:column> 
    ... 
</p:dataTable> 

とJavaScriptは次のようになります:を注意する

$(document).ready(function() { 
    tableWidget.thead.find('> tr > th.ui-filter-column > .ui-column-filter').each(function() { 
     var filter = $(this); 
     if(filter.is('input:text')) { 
      if(tableWidget.cfg.filterEvent!="enter"){ 
       //unbind current handler 
       filter.unbind(tableWidget.cfg.filterEvent); 
       //bind new handler that accounts for conditional filtering 
       filter.bind(tableWidget.cfg.filterEvent, function(c) { 
        if(filter.val().length > 3) { 
         //Primefaces 3.5 implementation 
         if(tableWidget.filterTimeout){ 
          clearTimeout(tableWidget.filterTimeout); 
         } 
         tableWidget.filterTimeout=setTimeout(function(){ 
          tableWidget.filter(); 
          tableWidget.filterTimeout=null}, 
         tableWidget.cfg.filterDelay); 
        } 
       }); 
      } 
     } 
    }); 
}); 

もの:

  • target="body"<head>でjavascriptを実行してはいけませんPrimefacesはウィジェット変数を$(document).ready()に初期化するため、の後に関数がを実行する保証はありません。
  • フィルタは列の検索ボックス(完了)に少なくとも4文字で開始されるため、ユーザーが自分で4文字以下のテキストを削除するとフィルタリングされていないビューを復元する必要があります。
  • 上記の解決策は、Primefaces 3.5 <p:dataTable>を対象としています。 Primefacesの実装はバージョンによって異なりますので、使用しているバージョンの実装をチェックするか、バージョン3.5にアップグレードしてください。
  • 入力フィールドをドロップダウンボックスとしてレンダリングするフィルタリングイベントの実装は対象外です。
  • テーブルはデフォルト(keyup)イベントをリッスンします。
関連する問題