【问题标题】:Conditional rendering in JSF [duplicate]JSF中的条件渲染[重复]
【发布时间】:2012-05-10 05:55:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: jsf jsf-2 rendering page-refresh


    【解决方案1】:

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

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

    但是,由于您指定的 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>
    

    【讨论】:

    • 感谢您的回答。我所做的是在我的表单中使用了 render="@form" 并且它起作用了。我也会尝试你的建议。
    • 这确实也可以,只要它是组件的父组件,它是 always 呈现的(正如我的回答试图告诉你的那样)。例如,如果表单包含 10 个根本不需要更新的其他组件,则可能只是不必要的开销。
    • 我们可以在 ajax 渲染中添加条件吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      style="visibility: #{questionchoose.show==false ? 'hidden' : 'visible'}"
      

      【讨论】:

      • 最好根本不渲染该项目,而不是不显示它。
      猜你喜欢
      • 2012-11-28
      • 2015-06-01
      • 2012-08-18
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2012-08-31
      • 2011-02-06
      相关资源
      最近更新 更多