我有一个需要在另一个选项卡中打开的报告,但前提是验证没有失败。就我而言,验证失败,并且同一页面在另一个选项卡中打开,其中包含验证错误。
Luiggi回答了POST的问题。但是,如果 GET 请求提供报告,则还有其他方法。
-
在
oncomplete
中使用window.open()
。<h:form> ... <p:commandButton action="#{bean.submit}" update="@form" oncomplete="if (args && !args.validationFailed) window.open('reportURL')" /> </h:form>
-
或者有条件地渲染带有
window.open()
<h:outputScript>
。<h:form> ... <p:commandButton action="#{bean.submit}" update="@form" /> <h:outputScript rendered="#{facesContext.postback and not facesContext.validationFailed}"> window.open('reportURL'); </h:outputScript> </h:form>
-
或者使用PrimeFaces
Primefaces#execute()
与window.open()
。public void submit() { // ... PrimeFaces.current().executeScript("window.open('reportURL');"); }
第一种方法要求在提交之前已经定义了URL,后两种方法允许您使用动态URL,例如window.open('#{bean.reportURL}')
。
这是否是一个明确的答案,但你可以有 2 个:1 个将触发服务器验证,另一个将在新页面中调用报告。下面是一个开始代码:
<h:form id="frmSomeReport">
<!-- your fields with validations and stuff -->
<!-- the 1st commandLink that will trigger the validations -->
<!-- use the oncomplete JS method to trigger the 2nd link click -->
<p:commandLink id="lnkShowReport" value="Show report"
oncomplete="if (args && !args.validationFailed) document.getElementById('frmSomeReport:lnkRealShowReport').click()" />
<!-- the 2nd commandLink that will trigger the report in new window -->
<!-- this commandLink is "non visible" for users -->
<h:commandLink id="lnkRealShowReport" style="display:none"
immediate="true" action="#{yourBean.yourAction}" target="_blank" />
</h:form>
<!-- a component to show the validation messages -->
<p:growl />
为了检查验证阶段是否包含任何错误,请在执行 ajax 命令时检查如何查找验证错误的指示(必需="true")