分页不适用于带过滤器的 Primefaces 数据表(仅限第一次)
Pagination is not working on Primefaces dataTable with filter (first time only)
我有一个应用程序(Websphere 8.5、Java EE6、JSF 2+ 上的 PrimeFaces 5.3)。
当我在浏览器中打开此页面(尝试 Chrome 和 FF)并首先尝试导航(在我的示例中有 2 个页面,22 个范围)- 我得到空 table(header 说 16-22 out of 22 但 table 是空的),并且每当我返回第一页时它仍然是空的 - 这是它的样子:
如果我先过滤 table - 分页效果很好。
我在其他组件上看到过类似的行为 - 例如其他 table 上的 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 是带有字符串 getters/setters 的 POJO。
这是由于 filteredValue
列表(即 #{rangeManagementBean.filteredRanges}
)一开始是空的:
setFilteredRanges(new ArrayList<RangeDto>());
您必须使用所有值初始化它:
setFilteredRanges(getAllRanges());
我有一个应用程序(Websphere 8.5、Java EE6、JSF 2+ 上的 PrimeFaces 5.3)。
当我在浏览器中打开此页面(尝试 Chrome 和 FF)并首先尝试导航(在我的示例中有 2 个页面,22 个范围)- 我得到空 table(header 说 16-22 out of 22 但 table 是空的),并且每当我返回第一页时它仍然是空的 - 这是它的样子:
如果我先过滤 table - 分页效果很好。
我在其他组件上看到过类似的行为 - 例如其他 table 上的 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 是带有字符串 getters/setters 的 POJO。
这是由于 filteredValue
列表(即 #{rangeManagementBean.filteredRanges}
)一开始是空的:
setFilteredRanges(new ArrayList<RangeDto>());
您必须使用所有值初始化它:
setFilteredRanges(getAllRanges());