Ich versuche, eine bedingt gerenderte Komponente zu aktualisieren.
<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}" />
Das geht aber nicht. Ich kann versichern, dass #{user}
ist aktuell verfügbar. Wie entsteht das und wie kann ich es lösen?
Es ist nicht möglich, eine Komponente mit Ajax erneut zu rendern (zu aktualisieren), wenn die Komponente selbst nicht an erster Stelle gerendert wird. Die Komponente muss immer gerendert werden, bevor Ajax sie erneut rendern kann. Ajax verwendet JavaScript document.getElementById()
, um die Komponente zu finden, die aktualisiert werden muss. Wenn JSF die Komponente jedoch nicht an erster Stelle gerendert hat, kann JavaScript keine zu aktualisierenden Elemente finden.
Die Lösung besteht darin, einfach auf eine übergeordnete Komponente zu verweisen, die immer gerendert wird.
<h:form>
...
<h:commandButton ...>
<f:ajax ... render=":text" />
</h:commandButton>
</h:form>
<h:panelGroup id="text">
<h:outputText ... rendered="#{not empty user}" />
</h:panelGroup>