ページ間を移動するときに、フィルター処理されたデータを保持する必要があります。データ テーブルのフィルター セルにデータを入力すると、フィルター処理された正しい行が表示されます。フィルター セルに最後に入力されたデータが表示するデータ行と一致しない場合、別のページに移動して戻ったときに、列ヘッダーとフィルター セルがレンダリングされません。ページネーターのみが表示されます。フィルター セルに最後に入力されたデータが一部のデータ行と一致する場合は正常に機能します。ページにデータテーブルを残さない場合でも、正しく機能します。
jsf コード:
<p:dataTable id="tableId" var="intance" widgetVar="instance"
value="#{model.rows}" filteredValue="#{model.filteredRows}"
sortBy="#{model.sortBy}" sortMode="multiple" rows="5"
rowsPerPageTemplate="5, 15" paginator="true" paginatorPosition="bottom">
<p:ajax event="filter" listener="#{model.onFilter}"/>
<p:ajax event="sort" listener="#{model.onSort}"/>
<p:columns id="columnId" value="#{instance.columnsData}"
var="instanceColumn" columnIndexVar="ind" rendered="true"
sortBy="#{instance.columnsData[ind]}"
filterBy="#{instance.columnsData[ind]}" filterMatchMode="contains"
filterValue="#{model.tableFilters[''.concat(ind)]}"
headerText="#{labels[ind]}">
<h:outputText value="#{instance.columnsData[ind]}"/>
</p:columns>
</p:dataTable>
ジャバコード:
public class Model {
private List<MyRow> filteredRows;
private List<MyRow> rows;
private Map<String, String> tableFilters;
public void onFilter(FilterEvent event) {
tableFilters = event.getFilters();
if (MapUtils.isEmpty(tableFilters)) {
filteredRows = null;
}
}
public void List<MyRow> getRows() {
//retreve data from service and transform to List<MyRow>)
return rows;
}
/* getters and setter */
}
public class MyRow {
private List<Object> columnsData;
/* getters and setters */
}
何かご意見は?コードは私には問題ないように見え、動作するはずです。私はprimefaces 3.5を使用しています。
ありがとう