0

ページ間を移動するときに、フィルター処理されたデータを保持する必要があります。データ テーブルのフィルター セルにデータを入力すると、フィルター処理された正しい行が表示されます。フィルター セルに最後に入力されたデータが表示するデータ行と一致しない場合、別のページに移動して戻ったときに、列ヘッダーとフィルター セルがレンダリングされません。ページネーターのみが表示されます。フィルター セルに最後に入力されたデータが一部のデータ行と一致する場合は正常に機能します。ページにデータテーブルを残さない場合でも、正しく機能します。

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を使用しています。

ありがとう

4

1 に答える 1

1

問題の根本value="#{instance.columnsData}"p:columns. #{instance}この場合の変数の使用p:dataTableは間違いです。

#{model.rows}ページが初めてロードされたときとそうでないときは正常に動作しますempty

#{model.rows}でなくempty、 のデータと一致しない値をフィルター セルに入力すると#{model.rows}、行は表示されませんが、データ コンテンツ (テーブル ヘッダーとフィルター セル) のみが部分的にレンダリングされるため、列ヘッダーとフィルター セルはレンダリングされます。ページのレンダリング中にレンダリングされました)。

別のページに移動してから、データ テーブル内のフィルター処理された行を含むページに戻ると、ページの新しい完全なレンダリングが行われます。したがって、この場合 (#{model.filteredRows}ではないnull)、含まれるデータの量は問題ではありません#{model.rows}#{model.filteredRows}データ テーブル コンテンツのレンダリングに使用されます。したがって、primefaces がデータ テーブルをレンダリングするとき、私の場合は is not のため、レンダリングするデータがまったく#{model.filteredRows}ありemptyませんnull

in#{instance}の変数を使用しているため、列をレンダリングせず、列ヘッダーもフィルター セルも表示しません。p:dataTablep:columnsp:columns

解決策:別のフィールドを使用して列情報を含めます。

//edited class Model
public class Model {
    //add a field that contains columns count. For example:
    private List<Integer> columns = Collections.nCopies(5, 1);

   //another fields
}

value="#{model.columns}"代わりに使用する必要がありますvalue="#{instance.columnsData}"

<p:columns id="columnId" value="#{model.columns}" 
    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>
于 2015-05-30T10:57:45.220 に答える