次のように、可変数の入力要素を持つフォームがあります。
<ui:repeat var="_lang" value="#{myBean.languages}">
<h:inputTextarea value="${_lang.title}" id="theTitle" />
<h:messages for="theTitle"/>
</ui:repeat>
バッキング Bean の特定のメソッドがトリガーされたときに、たとえば の 2 回目の繰り返しにメッセージを追加したいがui:repeat
、他のものには追加したくない。
ここでこの質問のさまざまなバリエーションを見てきましたが、すべての問題ui:repeat
は、JSF コンポーネント ツリーで の反復が利用できないことが原因のようです。
私がこれまでに試したこと:
h:inputTextarea
s をMap<String,UIComponent>
Beanの a にバインドします。(a) ...Using...binding="#{myBean.uiMap[_lang.id]}"
(_lang.id
は一意の文字列)。これにより、JBWEB006017: Target Unreachable, ''BracketSuffix'' returned nullが生成されました。(ID を使用して対応する文字列のマップをダンプしました。同じ構文が の外でも問題なく動作しますbinding
) (b) ...または...binding="#{myBean.uiMap.get()}"
. これにより、ページが正常にレンダリングされますが、メソッドのボタンを押してもセッターが呼び出されないため、UIComponent
が に追加されることはありませんMap
。h:inputTextarea
s を Bean の配列にバインドUIComponent[]
し、適切な数の null を事前に入力してから、行カウンターをui:repeat
xhtml ファイルのインデックスとして使用します。Null ポインター例外が発生しました。配列のセッターが呼び出されなかったため、配列に実際UIComponent
の s が取り込まれませんでした。外部
h:panelGroup
を Bean にバインドし、JSF ツリー内のその子の中から入力要素を再帰的に見つけようとします。入力の 1 つだけが見つかりました。上記の「反復が利用できない」問題を参照してください。また、行番号を手動で置き換えて生成しようとしました
ui:repeat
がc:forEach
(JSF ツリーで使用できるようにするため)、レンダリングされた出力はまったく得られませんでした。
(注: 目的は検証エラー メッセージを表示することですが、それらはバッキング Bean からf:validator
取得する必要があります。バッキング Bean のデータに対して検証する必要があるため、カスタムのものであっても、または類似のものを使用することは実際にはオプションではありません。 )
率直に言って、私はアイデアがありません。これはそれほど難しいことではありませんよね?
編集:
私の 3 回目の試みである outer へのバインドではh:panelGroup
、JSF ファインダー関数を次に示します。
private List<UIComponent> findTitleComponents(UIComponent node) {
List<UIComponent> found = new ArrayList<UIComponent>();
for (UIComponent child : node.getChildren()) {
if (child.getId().equals("theTitle")) {
found.add(child);
log.debug("have found "+child.getClientId());
} else {
found.addAll(findTitleComponents(child));
log.debug("recursion into "+child.getClientId());
}
}
return found;
}
これを で呼び出しています。これは、の周りのnode
バインディングです。(私のライブ アプリケーションはもう少し入れ子構造になっているため、再帰を使用しています) これですべての "theTitle" テキストエリアが得られるので、メッセージを追加したり、属性を好きなように読み取ったりできると思いました。残念ながら、メソッドは1 つの「theTitle」コンポーネントのみを返し、ログ メッセージはその理由を示しています。UIComponent
h:panelGroup
ui:repeat
生成されたページの DOM では、id は "myform:myPanelGroup:0:theTitle" (の反復カウンターを含むui:repeat
) のようになりますが、Bean は getClientId() のように見えるmyform:myPanelGroup:theTitle
だけで、最後に (私は推測しますか?) 反復。