Ajax update/render не работает на компоненте, который имеет атрибут render

Я пытаюсь 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} действительно доступен. Как это вызвано и как я могу его решить?

Ответ 1

Невозможно повторно обработать (обновить) компонент 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>

См. также: