仅在通过自定义验证操作时才使用 oncomplete 显示 p:dialog

mog*_*ara 2 jsf primefaces jsf-2

当我尝试在oncomplete属性中进行测试时,显示对话框时出现问题。
但是当我刷新页面时它工作正常,我必须刷新支持 bean 中变量的每次更改。即使我在没有测试的情况下显示对话框,它也能正常工作。问题出在调试模式。get在调用操作后进行测试时,JSF 不会调用。

<p:commandButton value="#{msg.LABEL_ADD}"
                 action="#{axeBean.calculer}"
                 style="width:100px;"
                 update="msgs"
                 oncomplete="if(#{axeBean.formvalide})  PF('dialog').show()" />
Run Code Online (Sandbox Code Playgroud)

formvalide是一个boolean

我该如何解决这个问题?

Jas*_*ies 5

我仍然相信问题的核心应该通过对我标记为重复的问题应用答案来解决。当你遇到几个问题时,我会在这里给你一些提示。

PrimeFacesoncomplete在测试时不会刷新变量......但是当我刷新页面时它工作正常。

您的按钮显然在您单击它之前就已呈现。所以oncomplete属性也被渲染了。它不是动态的。因此,在调用操作时不会重新评估它。
如果您需要#{axeBean.formvalide}在某些 JavaScript 调用中访问,请将其用作隐藏输入的值,并在调用操作后更新输入。现在您可以使用document.getElementById('hiddenInputsClientId').value.

也可以看看:

当我尝试在oncomplete属性中进行测试时,显示对话框时出现问题。

您不需要公开自己的validationFailed. PrimeFaces 将argsoncomplete函数中为您提供一个对象,validationFailed如果验证失败,该对象将包含一个属性。所以只需使用:

oncomplete="if (args &amp;&amp; !args.validationFailed) PF('dialog').show()"
Run Code Online (Sandbox Code Playgroud)

也可以看看:

validationFailed 仅使用必需的和客户端验证,但我想在支持中验证某些内容...

只需执行您在操作中需要执行的检查即可。如果您的自定义验证失败,您可以在 Faces 上下文中设置一个标志:

FacesContext.getCurrentInstance().validationFailed();
Run Code Online (Sandbox Code Playgroud)

如果您需要设置错误消息,请使用:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "message", null);
FacesContext.getCurrentInstance().addMessage("clientId", message);
Run Code Online (Sandbox Code Playgroud)

这里可以使用nullasclientId来设置全局消息。

如果您使用的是OmniFaces,您可以简单地使用:

Faces.validationFailed();
Messages.addError("clientId", "message");
Run Code Online (Sandbox Code Playgroud)

也可以看看:

我不确定你在做什么检查......通过创建自定义验证器你可能会更好。看: