从Primefaces dataTable中检索分页对象

时间:2015-11-24 14:42:21

标签: jsf jsf-2 primefaces

我目前正在使用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}

来解决我的问题

1 个答案:

答案 0 :(得分:1)

评论太长了......

DataTable是单个UIComponent,并且没有分页器'JSF组件'(UIComponent)。
因此,您需要对分页执行的每项操作都必须直接在DataTableDataModel上进行(当作为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端,因为它是由渲染器生成的;每个信息渲染器都知道它只在服务器端可用且可访问。