私は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
)イベントをリッスンします。
私が見てきたことから、テーブル全体を検証するか、PFデータテーブルのソースを少し変更して再コンパイルするかの選択肢があります。あなたはどちらを実行しますか? – kolossus
@kolossus:私の問題のためにデータテーブルのソースコードからいくつかのメソッドをオーバーライドすればOKです。 PFがdatatableバージョンを進めるなら、それは私の頭上にはならないはずです。 – Arun
@kolossus PFデータテーブルのソースを少し変更するためのソリューションを提供できますか? – tylerdurden