Jsf 获取动态元素的p:dataTable中的行号

Jsf 获取动态元素的p:dataTable中的行号,jsf,primefaces,Jsf,Primefaces,我很好奇如何获取中元素的行号 <p:dataTable id="userDataTable" value="#{bean.rows}" rowIndexVar="rowIndex"> <p:column headerText="RowCounter"> <p:commandLink id="row#{rowIndex+1}" actionListener="#{bean.getRows}"> <h:outp

我很好奇如何获取
中元素的行号

<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>

无论单击哪个
,始终打印第1行。我遗漏了什么?

至于您的具体问题,JSF组件的
id
attribtue将在视图构建期间进行评估。但是,
{rowIndex}
仅在视图渲染期间设置。因此,在计算
id
属性时,
{rowIndex}
未被设置,默认为
0
。这个问题本质上与这里已经回答和解释的理由完全相同:因此请注意,只有一个组件,而不是多个组件。只是它在生成HTML时被多次重用(每次都使用相同的组件ID!)

要修复它,只需使用
id=“row”
。在这种特殊情况下,动态ID没有意义。JSF已经自动在行索引前加上前缀(检查生成的HTML输出以查看它)。我不知道为什么您需要在这里手动指定行索引,因此很难提出正确的解决方案,因为您可能根本不需要它。另见

对于确实需要行索引的情况,可以通过以下方式获得:

Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex");
UIComponent#getNamingContainer()
返回最接近的父级,在您的特定情况下,该父级是数据表本身,具有特殊的风格,或者反过来又具有
rowIndex
属性。您也可以这样做,这是一种更自我记录的方式:

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

非常感谢您的提示和易于理解的解释!非常感谢!
UICommand commandLink = (UICommand) ae.getComponent();
UIData dataTable = (UIData) commandLink.getNamingContainer();
Integer rowIndex = dataTable.getRowIndex();