首页 > 解决方案 > 我可以在非 ajax primefaces 操作的文件响应后执行 javascript 吗?

问题描述

我的 primefaces 应用程序中有一个表单,它从支持 bean 调用一个动作,该动作响应一个文件,供用户使用 outputStream 下载。

在客户端,我有一个带有 onclick 事件处理程序的假提交命令按钮,它触发显示微调器的 javascript,然后单击一个隐藏的“实际”提交命令按钮,该按钮调用以文件响应的支持 bean 操作。

收到回复后,我想隐藏微调器。

我知道如果我希望服务器响应文件,我必须使用 ajax=false。但是我不能使用一个完整的监听器。

一旦我在客户端得到响应,这里是否有任何解决方案/解决方法可以触发一些 javascript?我在网上找到了一些旧论坛帖子,但没有一个包含可行的。

// The buttons and spinner
<i class="fa fa-spin fa-spinner" id="spinner" style="display:none;"/>
<p:commandButton widgetVar="fakeSubmitButton" type="button" value="Submit" onclick="submit9);" ajax="false" /> 
<p:commandButton widgetVar="actualSubmitButton" type="submit" action="#{testController.respondWithFile}" value="" style="display:none;" ajax="false"/> 

// ... and the two javascript functions 
function submitReport() {
    $('#spinner').show();
    PF('actualSubmitButton').getJQ().click();
}           
function postSubmitReport() {
    $('#spinner').hide();
}

// ... and on the server side I respond with a file by grabbing the ExternalContext from the FacesContext and using its outputStream.

标签: javascripthttpjsfprimefaces

解决方案


如果有更好的选择,我仍然想听听它们,但是我想出了一种方法来实现我想要的行为,方法是使用类似于展示示例的 ap:fileDownload:https ://www.primefaces.org/showcase/ ui/file/download.xhtml。在服务器端,我的代码相对没有变化,除了使用 ExternalContext 的输出流返回响应文件之外,我正在构建一个 StreamedContent,它从 fileDownload 小部件调用的函数返回。


推荐阅读