我有像这样的primafaces数据
<pf:dataTable id="#{controller.tableComponentId}"
rows="#{controller.rowsPerPage}"
rowsPerPageTemplate="#{controller.rowsPerPageTemplate}"
<pf:ajax event="page" listener="#{controller.onPageChange}"/>
/>
我的问题是当用户更改要显示的行数时。页面事件被触发,但具有旧的行值。因此,如果行的初始值为10,则用户将其更改为25.我仍然读取值10,然后JSF调用rowsPerPage setter。
我知道这个帖子PrimeFaces dataTable: how to catch rows-per-page event?这基本上是同一个问题。我尝试了这里提到的解决方案,但它对我没有用。我也使用分页,但为了简单起见,我没有把它放在我的代码中。
我还尝试使用process =“@ form”并读取请求参数映射,但是在ajax请求中没有发送“dt_rppDD”值。还有其他任何建议吗?
答案 0 :(得分:0)
页:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Datatable Page</title>
</h:head>
<h:body>
<h:form>
<p:dataTable id="#{datatablePage.tableComponentId}" rows="#{datatablePage.rows}" paginator="true"
rowsPerPageTemplate="#{datatablePage.rowsPerPageTemplate}" value="#{datatablePage.list}" var="row">
<p:ajax event="page" listener="#{datatablePage.onPageChange}"/>
<p:column>
<h:outputText value="#{row}"/>
</p:column>
</p:dataTable>
</h:form>
</h:body>
</html>
支持bean:
package org.antonu17;
import org.omnifaces.cdi.ViewScoped;
import org.omnifaces.util.Faces;
import org.primefaces.event.data.PageEvent;
import javax.faces.component.UIComponent;
import javax.inject.Named;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@Named("datatablePage")
@ViewScoped
public class DatatablePage implements Serializable {
private String tableComponentId = "table";
private Integer rows = 20;
private String rowsPerPageTemplate = "20,30,40,50";
private List<Integer> list = IntStream.range(1,200).boxed().collect(Collectors.toList());
public void onPageChange(PageEvent event) {
System.out.println(Faces.getRequestParameter(((UIComponent)event.getSource()).getClientId().concat("_rows")));
}
public String getTableComponentId() {
return tableComponentId;
}
public void setTableComponentId(String tableComponentId) {
this.tableComponentId = tableComponentId;
}
public Integer getRows() {
return rows;
}
public void setRows(Integer rows) {
this.rows = rows;
}
public String getRowsPerPageTemplate() {
return rowsPerPageTemplate;
}
public void setRowsPerPageTemplate(String rowsPerPageTemplate) {
this.rowsPerPageTemplate = rowsPerPageTemplate;
}
public List<Integer> getList() {
return list;
}
}
答案 1 :(得分:0)
我找到了解决问题的方法,但这与我提出的问题无关。由于我使用自己的PaginatorElementRenderer
实现,JSF并没有使用我的类,而是默认的类。
此链接中的问题是解释我的问题和解决方案。
How to customize Pagination in Primefaces Data Table
由于我使用的是旧版本而不是5.1,我不得不使用反射来访问地图并设置我自己的类。