12

您好,我有这段代码可以有条件地在我的页面中呈现组件:

<h:commandButton action="#{Bean.method()}"  value="Submit">
   <f:ajax execute="something" render="one two" />
</h:commandButton>

<p><h:outputFormat rendered="#{Bean.answer=='one'}" id="one" value="#{messages.one}"/></p>
<p><h:outputFormat rendered="#{Bean.answer=='two'}" id="two" value="#{messages.two}"/></p>

它得到答案并呈现组件,但为了在我的页面上看到它,我需要刷新页面。我该如何解决这个问题?有什么建议么?

4

3 回答 3

19

JSF 组件的rendered属性是一个服务器端设置,它控制 JSF 是否应该生成所需的 HTML。

<f:ajax>标记的属性render应该指向 JSF 生成的 HTML 元素的(相对)客户端 ID,JavaScript 可以document.getElementById()从 HTML DOM 树中获取该元素,以便在完成 ajax 请求时替换其内容。

但是,由于您指定的 HTML 元素的客户端 ID 永远不会由 JSF 呈现(由于renderedfalse),因此 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>
于 2012-04-30T19:11:06.473 回答
4

我知道这不是问题的中心点,但由于我过去曾多次遇到此问题,因此我只是将其发布在这里以帮助有需要的其他人。对于使用 PrimeFaces 的用户,PrimeFaces Extension 中有一个名为Switch的组件。

有时您需要根据值显示不同的输出或组件。通常你可以通过使用ui:fragment标签来实现这一点。使用pe:switchutil 标签,您将不再需要ui:fragment使用不同的检查来声明标签,例如ui:fragment rendered="#{!empty someController.value}", 。

于 2015-05-15T11:59:06.010 回答
-1
style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}"
于 2013-04-16T09:13:22.233 回答