如何在执行ajax命令时查找验证错误(required ="true")的指示

Dan*_*iel 32 jsf-2

我在对话框中有一个表单,通过单击带有ajax的commandbutton来关闭该表单,

像这样

<h:commandButton value="Add" action="#{myBean.addSomething(false)}"
    id="add_something_id" >
    <f:ajax render="@form someTable" execute="@form"
        onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)

这是关闭对话框的js代码

    function closeAddNewSomethingDialogIfSucceeded(data) {
        if(data.status === 'success') {
            $("#dialog_id").dialog("close");
        }
    }
Run Code Online (Sandbox Code Playgroud)

直到这里没问题......

现在我将一些对话框表单字段更改为required="true"现在我想阻止关闭对话框我得到验证错误...

但是ajax data.status仍然达到了它的success状态,我无法弄清楚我可以挂钩的验证失败的迹象......

有任何想法吗?

感谢BalusC回答我做了以下事情:

在JSF中,补充道:

    <h:panelGroup id="global_flag_validation_failed_render">
        <h:outputText id="global_flag_validation_failed" value="true" 
            rendered="#{facesContext.validationFailed}"/>
    </h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

f:ajax变成了

<f:ajax render="@form someTable global_flag_validation_failed_render"
Run Code Online (Sandbox Code Playgroud)

并在js中添加了以下检查

if(data.status === 'success') {
    if($("#global_flag_validation_failed").length === 0){
         $("#dialog_id").dialog("close");
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 58

不是专门用于required="true",但您可以检查#{facesContext.validationFailed}验证是否一般失败.如果将此结合检查是否按下了相关按钮#{not empty param[buttonClientId]},则可以将其放在以下rendered属性中<h:outputScript>:

<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}">
    <f:ajax execute="@form" render="@form someTable" />
</h:commandButton>
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}">
    $("#dialog_id").dialog("close");
</h:outputScript>
Run Code Online (Sandbox Code Playgroud)

(请注意,您需要确保脚本也由f:ajax重新呈现)

有点hacky,但onevent由于标准JSF实现不提供有关ajax响应中的验证状态的任何信息,因此无法在函数中处理它.

如果您碰巧使用RichFaces,那么您可以oncomplete<a4j:xxx>命令按钮/链接的属性中使用EL .它们是基于每个请求进行评估,而不是像标准JSF和PrimeFaces那样基于每个视图进行评估:

<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" />
Run Code Online (Sandbox Code Playgroud)

或者,如果您碰巧使用PrimeFaces,那么您可以利用PrimeFaces扩展ajax响应的事实,该附加args.validationFailed属性直接注入属性的JavaScript范围oncomplete:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" />
Run Code Online (Sandbox Code Playgroud)

(注意,&amp;已使用而不是&,因为&是XML/XHTML中的特殊字符)

或者您可以RequestContext在bean的action方法中使用PrimeFaces的API以编程方式在呈现的视图中执行JavaScript.

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')");
Run Code Online (Sandbox Code Playgroud)

不需要条件检查,因为当验证失败时,无论如何都不会调用bean的action方法.