我有这个命令按钮:
<p:commandButton action="#{reportBB.createReport}" ajax="false" id="createReport" onclick="form.target='_blank'" value="#{msg['create.report']}" />
这将打开一个新页面并加载 pdf 报告。它总是打开新页面,然后验证必填字段。我需要先验证所有必填字段是否已填写,然后打开新页面。
这可能吗?我能做些什么?
我有这个命令按钮:
<p:commandButton action="#{reportBB.createReport}" ajax="false" id="createReport" onclick="form.target='_blank'" value="#{msg['create.report']}" />
这将打开一个新页面并加载 pdf 报告。它总是打开新页面,然后验证必填字段。我需要先验证所有必填字段是否已填写,然后打开新页面。
这可能吗?我能做些什么?
您首先需要更改onclick
要使用的oncomplete
。然后将它的执行与请求变量的验证状态联系起来:
<p:commandButton action="#{reportBB.createReport}" ajax="false" id="createReport" oncomplete="if (!args.validationFailed){form.target='_blank'}" value="#{msg['create.report']}" />
您必须切换到的原因oncomplete
是在处理 JSF 请求之后oncomplete
运行,至少到验证/转换阶段。在验证阶段设置请求的状态,它基于您将显示 PDF 的状态。出于同样的原因,为时尚早。onclick
该args
对象是携带一些有用信息的 PF 对象。我上面的代码片段询问了请求的验证状态。
我相信这是你问题的核心。关于实际验证我认为是表单中的多个字段的一些提示:
最简单的方法是immediate="true"
在您正在验证的输入组件上进行设置。这样,如果验证失败,则永远不会调用命令按钮的操作。您只需要确保命令按钮与输入组件的格式相同。
您可以使用omnifaces validateAll组件在一处验证多个字段
另一种方法是在表单中的所有字段都通过验证时禁用命令按钮并启用 ajax。