8.11. 対話型コンポーネントと JSF コンポーネントのバインディング
対話型コンポーネントには、JSF コンポーネントへのバインディングの保持には使用できないという小さな制限があります (一般的には、 アプリケーションロジックからビューに強い依存関係を作成するため、必ず必要でない限りこの JSF の機能は使用しないことが一般的に推奨されます)。ポストバック要求では、 Seam 対話コンテキストが復元される前、ビュー復元フェーズ中にコンポーネントのバインディングが更新されます。
これに対処するには、 イベントスコープのコンポーネントを使ってコンポーネントバインディングを格納し、必要とする対話スコープのコンポーネントにそれをインジェクトします。
@Name("grid")
@Scope(ScopeType.EVENT)
public class Grid {
private HtmlPanelGrid htmlPanelGrid; // getters and setters
...
}
@Name("gridEditor")
@Scope(ScopeType.CONVERSATION)
public class GridEditor {
@In(required=false)
private Grid grid;
...
}
また別の制限として、対話スコープのコンポーネントをバインドされた JSF コントロールでイベントスコープのコンポーネントにインジェクトできない点があります。これには
facesMessages のような Seam の組み込みコンポーネントが含まれます。
暗黙の
uiComponent ハンドルで JSF コンポーネントツリーにアクセスすることもできます。 次の例では反復中にデータテーブルを支える UIData コンポーネントの getRowIndex() にアクセスし、 現在の行番号を表示します。
<h:dataTable id="lineItemTable" var="lineItem"
value="#{orderHome.lineItems}">
<h:column>
Row: #{uiComponent['lineItemTable'].rowIndex}
</h:column>
...
</h:dataTable>
このマップでは、JSF UI のコンポーネントはクライアント識別子で使用可能です。