2

rendered基本的にケースステートメントとして使用しているとしましょう。入力欄にラベルとメッセージがあるのですが、場合によって欄自体を変えて欲しいです。そのような:

<p:inputText id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsInput}" />
<p:calendar  id="foo" value="#{myBean.params[paramKey]}" 
   rendered="#{paramIsCalendar}" />

それを行うと、次のエラーが表示されます。java.lang.IllegalStateException: Component ID j_idt64:foo has already been found in the view.

回避策として、各パラメータ タイプに多数のラベル/メッセージを作成し、それらの ID を変更しました。しかし、これは私の質問をもたらします。ID を持つコンポーネントが 1 つだけ実際にレンダリングされる場合、jsf ファイルで複数のコンポーネントを定義することが問題になるのはなぜですか? それらをすべて同じIDで保持する方法はありますか?

4

2 に答える 2

9

JSF コンポーネント ID は、ビューのレンダリング時のみではなく、ビューのビルド時に固有であると想定されています。このようにして、実際には無効な同じ ID を持つ2 つのJSF コンポーネントが効果的に作成されます。ビューのビルド後に、目的の ID を持つ1 つの JSF コンポーネントを JSF コンポーネント ツリーに効率的に配置したいと考えています。

これは、ビューのレンダリング時に条件付きで HTML 出力を生成するのではなく、ビューのビルド時にコンポーネントを設定することで実現できます。これには JSTL<c:if>タグを使用できます。

<c:if test="#{paramIsInput}">
    <p:inputText id="foo" value="#{myBean.params[paramKey]}" />
</c:if>
<c:if test="#{paramIsCalendar}">
    <p:calendar id="foo" value="#{myBean.params[paramKey]}" />
</c:if>

ただし、これには注意点があります。<c:if test>条件は、JSF レンダリング時にのみ認識される変数に依存することはできません。したがって、JSF反復コンポーネントに依存しvarたり、ビュースコープのBeanなどのプロパティにする必要はありません.

以下も参照してください。

于 2012-08-28T17:30:44.067 に答える
4

ID を持つコンポーネントが 1 つだけ実際にレンダリングされる場合、jsf ファイルで複数のコンポーネントを定義することが問題になるのはなぜですか?

レンダリングされるコンポーネントが 1 つだけであることを、JSF はどのようにして知るのでしょうか? inを使用ELしてrenderedおり、両方とも true と評価できます。これは、名前付けコンテナー内に重複した ID を含めることはできないというドキュメントです。

指定された識別子は、NamingContainer である最も近い祖先 UIComponent の子孫であるすべてのコンポーネント (ファセットを含む) 間で一意である必要があります。または、NamingContainer であるそのような祖先がない場合は、コンポーネント ツリー全体のスコープ内で一意である必要があります。

-

それらをすべて同じIDで保持する方法はありますか?

複数のコンポーネントに同じ ID を使用したい場合は、名前付けコンテナーを分離する必要があります。

PanelGridをネーミング コンテナとして使用できます。

于 2012-08-28T17:18:42.960 に答える