小编典典

提交后发生验证错误时,请保持p:dialog打开

ajax

最小示例对话框:

<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中的布尔值字段。那行得通,但是它却使用户界面变慢,因为弹出或弹出对话框需要点击服务器。


阅读 241

收藏
2020-07-26

共1个答案

小编典典

onsuccess运行,如果AJAX请求本身是成功的(即有没有网络故障,未捕获的异常等),如果不采取行动方法成功地调用。

给定一个<p:dialogwidgetVar="testDialog">,您可以删除onsuccess并将其替换为RequestContext#execute()内部的PrimeFacessaveMethod()

if (success) {
    RequestContext.getCurrentInstance().execute("PF('testDialog').hide()");
}

注意:PF()在PrimeFaces 4.0中引入。在较旧的PrimeFaces版本中,您需要testDialog.hide()使用。

如果您不想使用特定于视图的脚本使控制器混乱,则可以改用oncomplete提供args具有布尔validationFailed属性的对象:

<p:commandButton ...
    oncomplete="if (args &amp;&amp; !args.validationFailed) PF('testDialog').hide()" />

if(args)检查是必要的,因为发生ajax错误时可能不存在该检查,因此在尝试获取validationFailed该错误时会导致新的JS错误。出于此答案中所述的原因,&amp;而不是必选,如果需要,可以重构为调用的JS函数,如验证失败时保持<p:dialog>打开中所示。&

如果然而,没有验证错误和操作方法被成功触发,而你仍想保留,比如,因为异常的服务方法调用的对话框打开,这时你可以手动触发validationFailedtrue通过明确从内支持bean的操作方法调用FacesContext#validationFailed()。例如

FacesContext.getCurrentInstance().validationFailed();
2020-07-26