Ajax更新/呈现不适用于具有呈现属性的组件

时间:2013-02-09 16:14:32

标签: jsf jsf-2 rendered-attribute conditional-rendering ajax-update

我正在尝试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 个答案:

答案 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>

另见: