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