最小示例对话框:
<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中的 bool 字段。这可行,但会使用户界面变慢,因为弹出或向下弹出对话框需要连接服务器。
最佳答案
onsuccess
如果 ajax 请求本身成功(即没有网络错误、未捕获的异常等),则运行,而不是在成功调用操作方法时运行。
给定 <p:dialog widgetVar="yourWidgetVarName">
,您可以删除 onsuccess
并将其替换为 PrimeFaces RequestContext#execute()
里面saveMethod()
:
if (success) {
RequestContext.getCurrentInstance().execute("PF('yourWidgetVarName').hide()");
}
注:PF()
在 PrimeFaces 4.0 中引入。在较旧的 PrimeFaces 版本中,您需要 yourWidgetVarName.hide()
相反。
如果您不想让 Controller 与特定于 View 的脚本困惑,您可以使用 oncomplete
相反,它提供了 args
具有 bool 值 validationFailed
的对象属性:
<p:commandButton ...
oncomplete="if (args && !args.validationFailed) PF('yourWidgetVarName').hide()" />
if (args)
检查是必要的,因为当发生 ajax 错误时它可能不存在,从而在您尝试获取 validationFailed
时导致新的 JS 错误。从中; &
而不是&
是强制性的,原因在this answer中解释。 ,如有必要,重构为您调用的 JS 函数,如 oncomplete="hideDialogOnSuccess(args, 'yourWidgetVarName')"
如Keep <p:dialog> open when validation has failed所示.
如果没有验证错误并且操作方法已成功触发,并且您仍然希望保持对话框打开,因为例如服务方法调用出现异常,可以手动触发validationFailed
至true
通过显式调用 FacesContext#validationFailed()
从内部支持 bean 操作方法。例如
FacesContext.getCurrentInstance().validationFailed();
关于ajax - 保留 p :dialog open when a validation error occurs after submit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195756/