条件付きでレンダリングされたコンポーネントを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}
は実際に利用可能です。これはどのように引き起こされ、どうすれば解決できますか?
コンポーネント自体が最初にレンダリングされない場合、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>