ajax - 保留 p :dialog open when a validation error occurs after submit

标签 ajax validation jsf primefaces dialog

最小示例对话框:

<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 &amp;&amp; !args.validationFailed) PF('yourWidgetVarName').hide()" />

if (args)检查是必要的,因为当发生 ajax 错误时它可能不存在,从而在您尝试获取 validationFailed 时导致新的 JS 错误。从中; &amp;而不是&是强制性的,原因在this answer中解释。 ,如有必要,重构为您调用的 JS 函数,如 oncomplete="hideDialogOnSuccess(args, 'yourWidgetVarName')"Keep <p:dialog> open when validation has failed所示.

如果没有验证错误并且操作方法已成功触发,并且您仍然希望保持对话框打开,因为例如服务方法调用出现异常,可以手动触发validationFailedtrue通过显式调用 FacesContext#validationFailed() 从内部支持 bean 操作方法。例如

FacesContext.getCurrentInstance().validationFailed();

关于ajax - 保留 p :dialog open when a validation error occurs after submit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9195756/

相关文章:

.NET AJAX 调用 ASMX、ASPX 或 ASSX?

javascript - 5 个逗号分隔的电子邮件 ID 的正则表达式

validation - 如何根据混淆矩阵计算 K 交叉验证的最终指标?

javascript - WordPress 中的 Ajax 调用不会转到 admin-ajax.php

ajax - 带有选项请求的 AWS S3 CORS 403 错误

validation - 验证数据时抛出异常是好还是坏主意?

html - RichFaces 页面主题——包含 CSS 文件?

java - JSF 1.2 中组合框的值更改时触发组合框的渲染

jsf - javax.faces.bean 类将被弃用 - NetBeans IDE 8.0 发出的通知

javascript - Ajax 函数用图像填充表格但不能用实时选择