我正在使用PrimeFaces轮询组件来刷新一些内容。
<h:form id="formBsvtt">
<p:messages autoUpdate="true" showDetail="false" />
<p:outputPanel id="panelOut" layout="block">
...
... content to refresh
...
</p:outputPanel>
<p:panelGrid id="panelIn" layout="block">
...
... various input components with validation
...
</p:panelGrid>
<p:poll widgetVar="poll1" autoStart="true" global="false" interval="15"
partialSubmit="true" process="@this" update="panelOut"
listener="#{myBean.myListener}">
</p:poll>
</h:form>
正如您所看到的,我正在使用autoUpdate=true的消息。我的问题是:如果出现验证错误,FacesMessages将显示,但不晚于15秒消失。
是否可以在不设置消息autoUpdate=false的情况下阻止轮询清除FacesMessages
我的web应用程序比上面指定的代码片段大得多,我的意图不是在每种可能的情况下手动更新消息!
PrimeFaces 2.x/3.x
这在本质上是不可能的,所以需要一个技巧。在<p:messages>
的rendered
属性中,检查是否触发了<p:poll>
,如果触发了,则返回false
。通过这种方式,JSF认为在呈现过程中组件树中没有可自动更新的消息组件,因此将忽略它
如果<p:poll>
被触发,则其客户端ID显示为javax.faces.source
请求参数。所以,应该这样做:
<p:messages ... rendered="#{param['javax.faces.source'] ne poll.clientId}" />
...
<p:poll binding="#{poll}" ... />
(注意:不需要额外的bean属性)
PrimeFaces 4.x+
所有PrimeFaces命令组件都获得了一个新的ignoreAutoUpdate
属性,您可以将其设置为false
以忽略ajax更新中的所有autoUpdate="true"
组件。
<p:poll ... ignoreAutoUpdate="true" />
对于使用Primeffaces 4.0及以上版本的用户,Primeffaces团队为其ajax感知组件添加了一个属性,以跳过autoUpdate设置为true的触发组件。所以你的投票将是
<p:poll ignoreAutoUpdate="true" .../>
另请参阅他们的博客文章:http://blog.primefaces.org/?p=2836