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 渲染数据表时,在我的情况下,根本没有要渲染的数据,因为#{model.filteredRows}is emptynot 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 回答