5

我很好奇如何获取<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>单击哪个。我错过了什么?

4

1 回答 1

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");

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

UICommand commandLink = (UICommand) ae.getComponent();
UIData dataTable = (UIData) commandLink.getNamingContainer();
Integer rowIndex = dataTable.getRowIndex();
于 2013-04-16T12:47:11.140 回答