最小示例对话框:
<p:dialog header="Test Dialog" widgetVar="testDialog"> <h:form> <p:inputText value="#{mbean.someValue}"/> <p:commandButton value="Save" onsuccess="testDialog.hide()" actionListener="#{mbean.saveMethod}"/> </h:form> </p:dialog>
我想要做的是让mbean.saveMethod以某种方式阻止对话框在出现问题时关闭,并且仅通过咆哮声输出消息。在这种情况下,验证程序无济于事,因为在将保存提交到后端服务器之前,无法确定someValue是否有效。当前,我使用visible属性进行此操作,并将其指向mbean中的布尔值字段。那行得通,但是它却使用户界面变慢,因为弹出或弹出对话框需要点击服务器。
在onsuccess运行,如果AJAX请求本身是成功的(即有没有网络故障,未捕获的异常等),如果不采取行动方法成功地调用。
onsuccess
给定一个<p:dialogwidgetVar="testDialog">,您可以删除onsuccess并将其替换为RequestContext#execute()内部的PrimeFacessaveMethod():
<p:dialogwidgetVar="testDialog">
RequestContext#execute()
saveMethod()
if (success) { RequestContext.getCurrentInstance().execute("PF('testDialog').hide()"); }
注意:PF()在PrimeFaces 4.0中引入。在较旧的PrimeFaces版本中,您需要testDialog.hide()使用。
PF()
testDialog.hide()
如果您不想使用特定于视图的脚本使控制器混乱,则可以改用oncomplete提供args具有布尔validationFailed属性的对象:
oncomplete
args
validationFailed
<p:commandButton ... oncomplete="if (args && !args.validationFailed) PF('testDialog').hide()" />
该if(args)检查是必要的,因为发生ajax错误时可能不存在该检查,因此在尝试获取validationFailed该错误时会导致新的JS错误。出于此答案中所述的原因,&而不是必选,如果需要,可以重构为调用的JS函数,如验证失败时保持<p:dialog>打开中所示。&
if(args)
&
<p:dialog>
&
如果然而,没有验证错误和操作方法被成功触发,而你仍想保留,比如,因为异常的服务方法调用的对话框打开,这时你可以手动触发validationFailed以true通过明确从内支持bean的操作方法调用FacesContext#validationFailed()。例如
true
FacesContext#validationFailed()
FacesContext.getCurrentInstance().validationFailed();