web-dev-qa-db-ja.com

Ajaxの更新/レンダリングは、レンダリングされた属性を持つコンポーネントでは機能しません

条件付きでレンダリングされたコンポーネントをajax更新しようとしています。

<h:form>
    ...
    <h:commandButton value="Login" action="#{login.submit}">
        <f:ajax execute="@form" render=":text" />
    </h:commandButton>
</h:form>
<h:outputText id="text" value="You're logged in!" rendered="#{not empty user}" />

ただし、それは機能しません。 #{user}は実際に利用可能です。これはどのように引き起こされ、どうすれば解決できますか?

45
Artem Moskalev

コンポーネント自体が最初にレンダリングされない場合、ajaxによってコンポーネントを再レンダリング(更新)することはできません。コンポーネントは、ajaxが再レンダリングする前に常にレンダリングする必要があります。 AjaxはJavaScript document.getElementById()を使用して、更新する必要のあるコンポーネントを見つけています。しかし、JSFがコンポーネントを最初にレンダリングしていない場合、JavaScriptは更新するものを見つけることができません。

解決策は、常にレンダリングされる親コンポーネントを単に参照することです。

<h:form>
    ...
    <h:commandButton ...>
        <f:ajax ... render=":text" />
    </h:commandButton>
</h:form>
<h:panelGroup id="text">
    <h:outputText ... rendered="#{not empty user}" />
</h:panelGroup>

こちらもご覧ください:

90
BalusC