ajax – 保持p:在提交后出现验证错误时打开对话框
最小示例对话框:
<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()" /> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |