JSF中的条件呈现

时间:2012-04-30 14:20:23

标签: jsf jsf-2 rendering page-refresh

您好我有这个代码在我的页面中有条件地呈现组件:

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

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

3 个答案:

答案 0 :(得分:15)

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

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

但是,由于您要指定从未由JSF呈现的HTML元素的客户端ID(由于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>

答案 1 :(得分:3)

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

  

有时您需要根据值显示不同的输出或组件。通常,您可以使用ui:fragment标记来实现此目的。使用pe:switch util标记,您不必再使用ui:fragment等不同的检查来声明ui:fragment rendered="#{!empty someController.value}"标记。

答案 2 :(得分:-1)

style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}"