JSF中的条件渲染

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>

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

3个回答

19
JSF组件的rendered属性是一个服务器端的设置,用于控制JSF是否应该生成所需的HTML。 <f:ajax>标签的render属性应该指向JSF生成的HTML元素的(相对)客户端ID,JavaScript可以通过从HTML DOM树中使用document.getElementById()来获取它的内容,并在ajax请求完成时替换其内容。
但是,如果您指定的HTML元素的客户端ID由于rendered设置为false而从未被JSF渲染,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>

谢谢你的回答。我在我的表单中使用了render="@form",它起作用了。不过,我也会尝试你建议的方法。 - sandra
只要该组件的父级始终被渲染(就像我的答案试图告诉您的那样),那确实也可以正常工作。例如,如果表单包含不需要更新的其他10个组件,则可能仅存在不必要的开销。 - BalusC
我们能在Ajax渲染中添加条件吗? - Ganesa Vijayakumar

4

我知道这不是问题的核心点,但由于过去我遇到了很多次这个问题,所以在这里发布它来帮助其他需要帮助的人。

对于那些使用PrimeFaces的人,有一个叫做Switch的PrimeFaces扩展组件。

有时候你需要根据一个值显示不同的输出或组件。通常你可以使用ui:fragment标签来实现。使用pe:switch工具标签,你不需要再声明带有不同检查的ui:fragment rendered="#{!empty someController.value}"标签了。


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

最好根本不要渲染该项目,而不是仅仅不显示它。 - dwjohnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接