p:dataTable在过滤和回页后不呈现标题

时间:2015-05-18 21:13:35

标签: jsf primefaces datatable filtering tableheader

我在页面之间导航时需要保留过滤后的数据。将数据输入到数据表的过滤单元格后,它会显示正确的过滤行。如果过滤器单元格中的最后输入数据与要显示的任何数据行不匹配,并且当我导航到另一个页面并返回时 - 不会呈现列标题和过滤单元格。只显示了paginator。如果过滤器单元格中最后输入的数据与某些数据行匹配,则可以正常工作如果我不在页面上留下数据表,它也能正常工作。

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>

java代码:

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。

由于

1 个答案:

答案 0 :(得分:1)

问题的根源是value="#{instance.columnsData}"的{​​{1}}。在这种情况下使用p:columns的{​​{1}}变量是错误的。

第一次加载页面并且#{instance}不是p:dataTable时,它可以正常工作。

#{model.rows}不是empty且我们在过滤器单元格中键入的值与#{model.rows}中的数据不匹配时,显示没有行但是列标题和过滤器无论如何都会渲染单元格,因为部分渲染只有数据内容(表格标题和过滤单元格在渲染页面时呈现)。

当我们导航到另一个页面然后返回到包含数据表中已过滤行的页面时,会有一个新的页面完整呈现。因此,在这种情况下(empty不是#{model.rows}),#{model.filteredRows}包含的数据量无关紧要。 null将用于呈现数据表内容。因此,当primefaces呈现数据表时,在我的情况下,由于#{model.rows} #{model.filteredRows}不是#{model.filteredRows},因此根本没有要呈现的数据。

由于我在empty中使用null的{​​{1}}变量,#{instance}将不会呈现任何列 - 也不会显示列标题和过滤单元格。

解决方案:使用separate field包含列信息。

p:dataTable

需要使用p:columns代替p: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
}