J'essaie d'ajax-mettre à jour un composant rendu conditionnellement.
<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}" />
Mais cela ne fonctionne pas. Je peux vous assurer que #{user}
est actuellement disponible. Comment cela est-il causé et comment puis-je le résoudre?
Il n'est pas possible de restituer (mettre à jour) un composant par ajax si le composant lui-même n'est pas rendu en premier lieu. Le composant doit toujours être rendu avant qu'ajax puisse le restituer. Ajax utilise JavaScript document.getElementById()
pour trouver le composant qui doit être mis à jour. Mais si JSF n'a pas rendu le composant en premier lieu, alors JavaScript ne trouve rien à mettre à jour.
La solution consiste à simplement référencer un composant parent qui est toujours rendu.
<h:form>
...
<h:commandButton ...>
<f:ajax ... render=":text" />
</h:commandButton>
</h:form>
<h:panelGroup id="text">
<h:outputText ... rendered="#{not empty user}" />
</h:panelGroup>