最小示例对话框:
<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以某种方式阻止对话框关闭,如果有一些问题,只通过growl输出消息。这是一个验证器不会帮助的情况,因为没有办法告诉someValue是否有效,直到保存提交到后端服务器。目前,我使用visible属性并将其指向mbean中的布尔字段。这工作,但它使用户界面更慢,因为弹出向上或向下的对话框需要击中服务器。
如果ajax请求本身成功(即没有网络错误,未捕获异常等),而不是如果action方法被成功调用,则onsuccess运行。
给定< p:dialog widgetVar =“testDialog”>你可以删除onsuccess和替换它的PrimeFaces RequestContext#execute()里面saveMethod():
if (success) { RequestContext.getCurrentInstance().execute("PF('testDialog').hide()"); }
注意:PF()是在PrimeFaces 4.0中引入的。在旧的PrimeFaces版本中,您需要testDialog.hide()。
如果你不喜欢用特定于视图的脚本混乱控制器,你可以使用oncomplete,它提供一个args对象,它有一个boolean validationFailed属性:
<p:commandButton ... oncomplete="if (args && !args.validationFailed) PF('testDialog').hide()" />
if(args)检查是必要的,因为当发生ajax错误时,它可能不存在,因此当您尝试从其中获取validationFailed时会导致新的JS错误; ;而不是&是必须的在this answer解释的原因,重构如果必要的一个JS函数,你调用像oncomplete =“hideDialogonSuccess(args,testDialog)”。
不幸的是,PrimeFaces不支持RichFaces已经支持的:请求时间重新评估on *属性中的EL。你也可以这样做:
<p:commandButton ... oncomplete="if (#{not facesContext.validationFailed}) PF('testDialog').hide()" />