原文地址http://winnerlxh.iteye.com/blog/770410
ModalPanel在有Ajax刷新请求的时候,一般会关闭,比如验证错误的时候
我自己的解决办法是让ModalPanel的现实与否不与JS有关,完全用conversation中的某个变量想关联,这样当一个ModalPanel显示以后,无论什么Ajax刷新请求都不回让ModalPanel关掉,除非我让他关掉
网上还有两种解决方案,现列举如下。
第一种方法:
<ui:define name="body">
<f:verbatim>
<a href="javascript:Richfaces.showModalPanel('_panel',{left:'auto', top:'auto'})">
Show Modal Panel
</a>
</f:verbatim>
<rich:modalPanel id="_panel">
<f:facet name="header">
<h:outputText value="test"></h:outputText>
</f:facet>
<h:form id="mpform">
<a4j:outputPanel ajaxRendered="true">
<h:messages id="error"></h:messages>
</a4j:outputPanel>
<h:inputText value="#{bean.property}" required="true"></h:inputText>
<a4j:commandLink value="click" oncomplete="windowclose();"
reRender="test" ></a4j:commandLink>
</h:form>
</rich:modalPanel>
<script type="text/javascript">
//<![CDATA[
function windowclose(){
if (document.getElementById('mpform:error')==null){
Richfaces.hideModalPanel('_panel');
};
};
//\]\]\>
</script>
</ui:define>
这种方法的思想是,在关闭ModalPanel的时候判断是否有message在里面,如果没有,就关掉,如果ModalPanel里面有message,就让它继续显示着。
第二种方法:
这种方法的前提是,使用Facelets
在模板里面增加这段代码:
<a4j:outputPanel ajaxRendered="true">
<h:form style="display:none" prependId="false">
<h:inputHidden id="maximumSeverity" value="#{facesContext.maximumSeverity.ordinal}"/>
</h:form>
</a4j:outputPanel>
然后在你需要加ModalPanel的页面增加以下这段JS代码:
function ajaxRequestContainsErrors() {
return document.getElementById("maximumSeverity").value == "2";
}
作用是检查是否包含错误消息
最后在具体的连接或者按钮上增加相应的处理事件:
<a4j:commandButton value="Save" action="#{myController.save}"
oncomplete="if (!ajaxRequestContainsErrors()) Richfaces.hideModalPanel('myModalPanelId');"/>