我正在尝试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}
实际可用。这是怎么造成的,我该如何解决?
答案 0 :(得分:88)
如果组件本身未首先呈现,则无法通过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>