webentwicklung-frage-antwort-db.com.de

Ajax Update / Render funktioniert nicht für eine Komponente, die das Attribut gerendert hat

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?

45
Artem Moskalev

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>

Siehe auch:

90
BalusC