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

あなたの具体的な問題に関しては、idビューのビルド時に JSF コンポーネントの属性が評価されます。ただし、#{rowIndex}ビューのレンダリング時にのみ設定されます。したがって、id属性が評価される時点では、#{rowIndex}はどこにも設定されておらず、デフォルトで に設定されてい0ます。この問題には、すでに回答され、ここで説明されているのと本質的にまったく同じ根拠があります: JSF2 Facelets の JSTL... は理にかなっていますか? したがって、複数ではなく、1 つのコンポーネントしかない ことに注意してください。<p:commandLink>HTML の生成中に何度も再利用されているだけです (毎回同じコンポーネント ID で!)。

それを修正するには、id="row"代わりに使用してください。この特定のケースでは、動的 ID は意味がありません。JSF はすでに自動的に行インデックスを先頭に追加します (生成された HTML 出力を確認して確認してください)。ここで行インデックスを手動で指定する必要があると誤って考えた理由が正確にわからないため、実際にはまったく必要ない可能性があるため、正しい解決策を提案するのは困難です。また、選択した行を dataTable 内の commandLink に渡すにはどうすればよいですか?も参照してください。

行インデックスが本当に必要な場合は、次の方法で取得できます。

Integer rowIndex = (Integer) ae.getComponent().getNamingContainer().getAttributes().get("rowIndex");

は、特定のケースではフレーバー内のデータ テーブル自体である、またはプロパティを持つ最も近い名前付けコンテナーUIComponent#getNamingContainer()の親を返します。または、そうすることもできます。これは、もう少し自己文書化されています。UIDatarowIndex

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