我很好奇如何获取一个元素的行号<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>点击哪一个.我错过了什么?
至于您的具体问题,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)
| 归档时间: |
|
| 查看次数: |
5571 次 |
| 最近记录: |