web-dev-qa-db-fra.com

La mise à jour / rendu Ajax ne fonctionne pas sur un composant ayant un attribut rendu

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?

45
Artem Moskalev

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>

Voir également:

90
BalusC