我在对话框中有一个表单,通过单击带有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 && !args.validationFailed) $('#dialog_id').dialog('close')" />
Run Code Online (Sandbox Code Playgroud)
(注意,&已使用而不是&,因为&是XML/XHTML中的特殊字符)
或者您可以RequestContext在bean的action方法中使用PrimeFaces的API以编程方式在呈现的视图中执行JavaScript.
RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')");
Run Code Online (Sandbox Code Playgroud)
不需要条件检查,因为当验证失败时,无论如何都不会调用bean的action方法.