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}实际上是可用的。 这是如何造成的,我该如何解决?

如果组件本身没有被渲染到一开始就不可能通过ajax重新渲染(更新)组件。 在Ajax可以重新渲染之前,组件必须被渲染。 Ajax使用JavaScript document.getElementById()来查找需要更新的组件。 但是,如果JSF没有渲染组件,那么JavaScript无法find任何更新。

解决方法是简单地引用总是呈现的父组件。

 <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 =“#{some}”嵌套一个组件,当我想要更新它时?
  • 如何findajax更新/渲染组件的客户端ID? 无法find含有“bar”引用的expression式“foo”的组件
Interesting Posts