我很好奇如何获取<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());
}
无论点击哪个row1
,始终打印<p:commandLink>
。我错过了什么?
答案 0 :(得分:3)
对于您的具体问题,在视图构建期间评估JSF组件的id
属性。但是,#{rowIndex}
仅在视图渲染时设置。因此,在评估id
属性时,#{rowIndex}
未设置,默认为0
。这个问题与此处已经回答和解释的基本完全相同:JSTL in JSF2 Facelets... makes sense?请注意,只有一个 <p:commandLink>
组件,而不是多个。它只是在生成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();