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正在使用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";引用自";条"

最新更新