Обновление / рендеринг Ajax не работает на компоненте с атрибутом рендеринга
Я пытаюсь 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>