Ajax更新后p:messages组件渲染状态未正常更新求助
解决方案
1. 检查p:messages的渲染绑定
得保证p:messages的render属性正确绑定到后台bean的布尔值:
- 如果bean里是字段属性(比如
private boolean canMessageShow;),这么写:<p:messages id="msg" render="#{bean.canMessageShow}" /> - 如果是getter方法(比如
public boolean isCanMessageShow()),要加括号:<p:messages id="msg" render="#{bean.canMessageShow()}" />
别犯EL表达式语法错误,不然渲染状态根本不会更新。
2. 更新p:messages的父容器
试试把p:messages包在h:panelGroup里,更新这个父容器而不是直接更新消息组件本身:
<h:panelGroup id="msgContainer"> <p:messages id="msg" render="#{bean.canMessageShow}" /> </h:panelGroup> <!-- pe:sheet里的ajax改成更新父容器 --> <pe:sheet ...> <p:ajax event="cellEdit" listener="#{bean.onCellEdit}" update="msgContainer sheetId" /> </pe:sheet>
有些时候组件的渲染状态变化,得靠父容器重新渲染才能生效。
3. 彻底清掉FacesContext里的消息
在后台bean的处理方法里,一定要在设置canMessageShow=false之前把所有消息清干净,而且之后别再调用addMessage:
public void onCellEdit(CellEditEvent event) { // 先处理你的业务逻辑 // 清空所有Faces消息 FacesContext.getCurrentInstance().getMessages().clear(); // 把消息组件的显示开关关掉 canMessageShow = false; // 注意:这里之后绝对不能再添加任何消息! }
顺便检查下有没有拦截器、过滤器或者其他后置代码在后面又偷偷加了消息。
4. 确认p:ajax的process属性
得保证p:ajax的process属性覆盖了需要提交的组件,这样bean里的canMessageShow才能被正确更新:
<p:ajax event="cellEdit" listener="#{bean.onCellEdit}" process="@form" update="msgContainer sheetId" />
用@form能确保表单里所有组件的状态都提交到后台。
5. 排查版本兼容性问题
PrimeFaces 6.2和PrimeFaces Extensions 6.2.10都是比较老的版本,可能存在组件交互的bug:
- 临时试试
update="@all",如果这样消息组件能正常消失,说明是局部更新的问题 - 可以查一下PrimeFaces官方的issue记录,看看有没有其他人遇到过类似问题
6. 检查视图状态保存配置
在faces-config.xml里把状态保存改成服务器端,避免客户端缓存导致状态不一致:
<application> <state-saving-method>server</state-saving-method> </application>
内容的提问来源于stack exchange,提问作者Samet Dağ
相关产品推荐
相关产品推荐

