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

时间:2013-04-16 10:10:42

标签: 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>

豆:

public void getRows(ActionEvent ae) {                   
    System.out.println(ae.getComponent().getId().toString());
}

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

1 个答案:

答案 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();