JSF 组件的rendered
属性是一个服务器端设置,它控制 JSF 是否应该生成所需的 HTML。
<f:ajax>
标记的属性render
应该指向 JSF 生成的 HTML 元素的(相对)客户端 ID,JavaScript 可以document.getElementById()
从 HTML DOM 树中获取该元素,以便在完成 ajax 请求时替换其内容。
但是,由于您指定的 HTML 元素的客户端 ID 永远不会由 JSF 呈现(由于rendered
是false
),因此 JavaScript 无法在 HTML DOM 树中找到它。
您需要将它包装在一个始终呈现的容器组件中,因此始终在 HTML DOM 树中可用。
<h:commandButton action="#{Bean.method()}" value="Submit">
<f:ajax execute="something" render="messages" />
</h:commandButton>
<p>
<h:panelGroup id="messages">
<h:outputFormat rendered="#{Bean.answer=='one'}" value="#{messages.one}"/>
<h:outputFormat rendered="#{Bean.answer=='two'}" value="#{messages.two}"/>
</h:panelGroup>
</p>
与具体问题无关,您可能存在设计错误。为什么您不只是创建一个#{Bean.message}
属性,而是在操作方法中使用所需的消息设置,这样您就可以使用:
<h:commandButton action="#{Bean.method()}" value="Submit">
<f:ajax execute="something" render="message" />
</h:commandButton>
<p>
<h:outputFormat id="message" value="#{Bean.message}" />
</p>