【问题标题】:Get row number in p:dataTable of dynamic element获取动态元素的 p:dataTable 中的行号
【发布时间】:2013-04-16 10:10:41
【问题描述】:

我很好奇如何获取<p:dataTable> 中元素的行号。

<p:dataTable id="userDataTable" value="#{bean.rows}" rowIndexVar="rowIndex">
    <p:column headerText="RowCounter">
        <p:commandLink id="row#{rowIndex+1}" actionListener="#{bean.getRows}">
            <h:outputText value="Show Row #{rowIndex+1}" />
        </p:commandLink>
    </p:column>
</p:dataTable>

豆子:

public void getRows(ActionEvent ae) {                   
    System.out.println(ae.getComponent().getId().toString());
}

无论点击哪个&lt;p:commandLink&gt;,总是打印row1。我错过了什么?

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    至于您的具体问题,JSF 组件的 id 属性是在视图构建时评估的。但是,#{rowIndex} 仅在视图渲染期间设置。因此,在评估id 属性的那一刻,#{rowIndex} 没有设置,默认为0。这个问题基本上与这里已经回答和解释的理由完全相同:JSTL in JSF2 Facelets... makes sense? 请注意,只有一个 &lt;p:commandLink&gt; 组件,而不是多个。只是它在生成 HTML 的过程中被多次重用(每次都使用相同的组件 ID!)。

    要修复它,只需改用id="row"。在这种特殊情况下,动态 ID 没有任何意义。 JSF 已经自动添加了行索引(检查生成的 HTML 输出以查看它)。我不确定您为什么 incorrectly thought 需要在此处手动指定行索引,因此很难提出正确的解决方案,因为您实际上可能根本不需要它。另见How can I pass selected row to commandLink inside dataTable?

    如果您真的需要行索引,您可以通过以下方式获取它:

    Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex");
    

    UIComponent#getNamingContainer() 返回最接近的 naming container 父级,在您的特定情况下,它是数据表本身,在风味或 UIData 中,因此具有 rowIndex 属性。您也可以这样做,这有点自我记录:

    UICommand commandLink = (UICommand) ae.getComponent();
    UIData dataTable = (UIData) commandLink.getNamingContainer();
    Integer rowIndex = dataTable.getRowIndex();
    

    【讨论】:

    • 非常感谢您的提示和易于理解的解释!非常感谢!
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2015-06-21
    • 2017-07-20
    相关资源
    最近更新 更多