您好我有这个代码在我的页面中有条件地呈现组件:
<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>
它得到答案并呈现组件,但为了在我的页面上看到它,我需要刷新页面。我该如何解决这个问题?有什么建议吗?
答案 0 :(得分:15)
JSF组件的rendered
属性是服务器端设置,它控制JSF是否应该生成所需的HTML。
<f:ajax>
标记的render
属性应该指向JSF生成的HTML元素的(相对)客户端ID,JavaScript可以从HTML DOM树中document.getElementById()
抓取该元素以替换其内容完成了ajax请求。
但是,由于您要指定从未由JSF呈现的HTML元素的客户端ID(由于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>
答案 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'}"