我正在尝试用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}
实际上是可用的。这是怎么造成的,我该如何解决?
如果组件本身没有首先呈现,那么就不可能通过ajax重新呈现(更新)组件。在ajax重新渲染组件之前,必须始终渲染组件。ajax正在使用JavaScriptdocument.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>
另请参阅:
- 为什么我需要嵌套具有rendered="rendered"的组件#{some}";在另一个组件中,当我想用ajax更新它时
- 如何找到ajax更新/渲染组件的客户端ID?找不到表达式为"的组件;foo";引用自";条"