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

cte*_*ekk 5 jsf primefaces

我很好奇如何获取一个元素的行号<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>
Run Code Online (Sandbox Code Playgroud)

豆:

public void getRows(ActionEvent ae) {                   
    System.out.println(ae.getComponent().getId().toString());
}
Run Code Online (Sandbox Code Playgroud)

始终打印row1,无论<p:commandLink>点击哪一个.我错过了什么?

Bal*_*usC 3

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

要修复它,只需使用id="row"即可。在这种特殊情况下,动态 ID 没有任何意义。JSF 已经自动在前面添加行索引(检查生成的 HTML 输出以查看它)。我不确定为什么您错误地认为您需要在此处手动指定行索引,因此很难提出正确的解决方案,因为您实际上可能根本不需要它。另请参阅如何将选定的行传递到 dataTable 内的 commandLink?

对于您确实需要行索引的情况,以下是获取它的方法:

Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex");
Run Code Online (Sandbox Code Playgroud)

返回UIComponent#getNamingContainer()最接近的命名容器父级,在您的特定情况下,它是数据表本身,或者UIData反过来具有该rowIndex属性。您也可以这样做,这是更多的自我记录:

UICommand commandLink = (UICommand) ae.getComponent();
UIData dataTable = (UIData) commandLink.getNamingContainer();
Integer rowIndex = dataTable.getRowIndex();
Run Code Online (Sandbox Code Playgroud)