Pagination对带有过滤器的Primefaces dataTable不起作用(仅限第一次)

时间:2016-01-04 09:40:40

标签: jsf jsf-2 primefaces pagination

我有一个应用程序(Websphere 8.5,Java EE6,JSF 2+上的PrimeFaces 5.3)。

当我在浏览器中打开此页面时(尝试使用Chrome和FF)并首先尝试导航(在我的示例中有2个页面,22个范围) - 我得到空表(标题显示22个中的16-22但是表格是空的),每当我回到第一页时仍然是空的 - 这是它的样子: enter image description here

如果我先过滤表 - 分页效果很好。

我已经看到了与其他组件类似的行为 - 例如其他表上的commandButton,但这是对问题的最小再现。如果我删除过滤 - 一切正常。

我想我在某个地方有错误但找不到它。

视图包含以下格式:

    <h:form id="form">
<p:dataTable id="mainTable" value="#{rangeManagementBean.allRanges}"
            var="range1" filteredValue="#{rangeManagementBean.filteredRanges}"
            paginator="true"
            paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
            rows="15">

            <p:column headerText="Site" sortBy="#{range1.siteName}"
                filterBy="#{range1.siteName}" filterMatchMode="contains">
                <h:outputText value="#{range1.siteName}">
                </h:outputText>
            </p:column>
        </p:dataTable>
</h:form>

支持bean代码是:

@ViewScoped
@ManagedBean(name = "rangeManagementBean")
public class RangeManagementBean {

private ArrayList<RangeDto> allRanges;
private ArrayList<RangeDto> filteredRanges;
@EJB
private RangeProvider rangeProvider;

@PostConstruct
public void init(){
    setAllRanges(new ArrayList<RangeDto>(rangeProvider.getAllRangesDto()));
    setFilteredRanges(new ArrayList<RangeDto>());
}

public ArrayList<RangeDto> getFilteredRanges() {
    return filteredRanges;
}

public void setFilteredRanges(ArrayList<RangeDto> filteredRanges) {
    this.filteredRanges = filteredRanges;
}

public ArrayList<RangeDto> getAllRanges() {
    return allRanges;
}

public void setAllRanges(ArrayList<RangeDto> allRanges) {
    this.allRanges = allRanges;
}
}

RangeDto是带有字符串getter / setter的POJO。

1 个答案:

答案 0 :(得分:2)

由于filteredValue列表(即#{rangeManagementBean.filteredRanges})最初为空而导致:

setFilteredRanges(new ArrayList<RangeDto>());

你必须使用所有值来初始化它:

setFilteredRanges(getAllRanges());