我目前正在使用JSF 2和Primefaces 5.2,更确切地说是p:dataTable
。
我使用p:dataTable
分页。
从我的Java bean中,我找不到检索任何分页组件的方法。我特别感兴趣的是我能得到的对象
{RowsPerPageDropdown}
<p:dataTable
var="item"
value="#{items}"
rows="10"
id="tableItems"
paginator="true" paginatorPosition="top" paginatorAlwaysVisible="true"
paginatorTemplate="{CurrentPageReport} {PreviousPageLink} Page : {JumpToPageDropdown} {NextPageLink} NbrElements : {RowsPerPageDropdown}"
rowsPerPageTemplate="#{fn:length(items)},10,20,50"
currentPageReportTemplate="{startRecord}-{endRecord} / {totalRecords}" binding="#{tableComponent.table}">
通过检查页面,下拉菜单ID为tableItems_rppDD
。
我尝试通过打印组件ID来找到它
FacesContext.getCurrentInstance().getViewRoot()...getChildren()
和findComponent()
的组合,但没有成功。
有谁知道如何抓住分页器或者是否有可能?或者它是一个纯粹的Javascript对象?
非常感谢
修改:
我将动态元素添加到我的列表中(p:dataTable
+ h:commandLink
)。
如果查看dataTable声明,{RowsPerPageDropdown}
的第一个元素是新列表中的元素数(让我们称之为n
)。
第一次,如果我从{RowsPerPageDropdown}
中选择第一个元素,则会显示n
元素。
如果我在列表中添加新元素,则{RowsPerPageDropdown}
的第一个元素变为n + 1
但表中显示的元素总数为n
(最新元素在下一页中)。
我已经通过重新实现微小更改{CurrentPageReport}
答案 0 :(得分:1)
评论太长了......
DataTable
是单个UIComponent,并且没有分页器'JSF组件'(UIComponent)。
因此,您需要对分页执行的每项操作都必须直接在DataTable
或DataModel
上进行(当作为value
属性传递时)。
但是,根据您的需要,您可以访问其属性:
DataTable table = [find component somehow: UIComponent.getCurrentComponent(context), context.getViewRoot().findComponent(expr), ...]
// if you need to know currently selected RowsPerPageDropdown (page size)
int rows = table.getRows(); // table.getRowsToRender();
// or you can get the template
String rowsPerPageTemplate = table.getRowsPerPageTemplate();
// and split options
String[] options = rowsPerPageTemplate.split("[,\\s]+");
您可以在<select>
源代码中找到DataTable如何呈现html org.primefaces.component.paginator.RowsPerPageDropdownRenderer
下拉列表。
@Kukeltje 这里有一个小例子:
该示例显示如何在服务器端获取所选行的下拉列值:选择行下拉列表值并单击命令按钮。
<p:growl id="messages" autoUpdate="true" showDetail="true"
showSummary="true" />
<h:form>
<p:dataTable id="table" var="elem" value="#{testTableBean.valueList}" rows="5"
paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="#{component.rowCount},5,10,15">
<p:column>
<h:outputText value="#{elem}" />
</p:column>
</p:dataTable>
<p:commandButton action="#{testTableBean.execute}" process="@form" value="execute" />
<p:commandButton process="@form" update="table"
actionListener="#{testTableBean.valueList.add('value #' += testTableBean.valueList.size())}"
value="add" />
</h:form>
和
@ManagedBean
@ViewScoped
public class TestTableBean implements Serializable
{
private static final long serialVersionUID = 1L;
private final List<String> valueList = new ArrayList<>();
@PostConstruct
public void init()
{
// add 25 dummy values
for(int i = 0; i < 25; i++)
{
valueList.add("value #" + i);
}
}
public void execute()
{
FacesContext context = FacesContext.getCurrentInstance();
// get current component: CommandButton
UIComponent component = UIComponent.getCurrentComponent(context);
// get the naming container: HtmlForm
UIComponent namingContainer = component.getNamingContainer();
// find data table by id
DataTable table = (DataTable) namingContainer.findComponent("table");
// get the displayed rows value: this value is updated by DataTableRenderer.decode()
// when user changes rows dropdown (previous ajax request)
int rows = table.getRows();
// add as message
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "rows: " + rows, null));
}
public List<String> getValueList()
{
return valueList;
}
}
@ccheneson :您不需要依赖html端,因为它是由渲染器生成的;每个信息渲染器都知道它只在服务器端可用且可访问。