web-dev-qa-db-ja.com

JSFでの条件付きレンダリング

こんにちは私は私のページのコンポーネントを条件付きでレンダリングするためにこのコードを持っています:

<h:commandButton action="#{Bean.method()}"  value="Submit">
   <f:ajax execute="something" render="one two" />
</h:commandButton>

<p><h:outputFormat rendered="#{Bean.answer=='one'}" id="one" value="#{messages.one}"/></p>
<p><h:outputFormat rendered="#{Bean.answer=='two'}" id="two" value="#{messages.two}"/></p>

答えを取得してコンポーネントをレンダリングしますが、ページに表示するには、ページを更新する必要があります。この問題を解決するにはどうすればよいですか?助言がありますか?

11
sandra

JSFコンポーネントのrendered属性は、JSFが目的のHTMLを生成するかどうかを制御するサーバー側の設定です。

_<f:ajax>_タグのrender属性は、JavaScriptがHTMLDOMツリーからdocument.getElementById()によって取得できるJSF生成HTML要素の(相対)クライアントIDを指している必要があります。 ajaxリクエストの完了時にその内容。

ただし、JSFによってレンダリングされないHTML要素のクライアントIDを指定しているため(renderedfalseであるため)、JavaScriptはHTMLDOMツリーでそれを見つけることができません。

alwaysレンダリングされ、したがってalwaysであるコンテナコンポーネントでラップする必要があります。 -)HTMLDOMツリーで利用できます。

_<h:commandButton action="#{Bean.method()}"  value="Submit">
   <f:ajax execute="something" render="messages" />
</h:commandButton>

<p>
    <h:panelGroup id="messages">
        <h:outputFormat rendered="#{Bean.answer=='one'}" value="#{messages.one}"/>
        <h:outputFormat rendered="#{Bean.answer=='two'}" value="#{messages.two}"/>
    </h:panelGroup>
</p>
_

無関係具体的な問題に対して、設計ミスの可能性があります。代わりに、actionメソッドで目的のメッセージを使用して設定した_#{Bean.message}_プロパティを作成しないのはなぜですか。そのため、次のものを使用できます。

_<h:commandButton action="#{Bean.method()}"  value="Submit">
   <f:ajax execute="something" render="message" />
</h:commandButton>

<p>
    <h:outputFormat id="message" value="#{Bean.message}" />
</p>
_
17
BalusC

それが質問の中心ではないことは知っていますが、過去に何度もこの問題を抱えていたので、困っている人を助けるためにここに投稿します。 PrimeFacesを使用する人のために、PrimeFaces Extensionには Switch というコンポーネントがあります。

値に応じて、異なる出力またはコンポーネントを表示する必要がある場合があります。通常、これはui:fragmentタグを使用して実現できます。 pe:switch utilタグを使用すると、ui:fragmentのようなさまざまなチェックを使用して、ui:fragment rendered="#{!empty someController.value}"タグを宣言する必要がなくなります。

3