PrimeFaces使用p:commandButton下载文件后组件无法更新,已有方案失效
问题解决方案
针对PrimeFaces 3.4.1版本下p:fileDownload完成后remoteCommand不触发组件更新的问题,可按以下步骤排查修复:
1. 修正monitorDownload回调写法
你当前代码里onclick中直接传入stop作为回调,在3.4.1版本中存在函数引用识别异常的问题,修改为匿名函数包裹调用:
<p:remoteCommand name="stop" update=":myComponentId" /> <p:commandButton value="download" ajax="false" onclick="PrimeFaces.monitorDownload(null, function(){ stop(); })" > <p:fileDownload value="#{myBean.download()}" /> </p:commandButton>
2. 手动指定下载监测Cookie路径
PrimeFaces 3.4.x默认使用的下载完成监测Cookie路径和当前页路径不匹配时,JS无法识别下载完成状态,导致回调不执行。你需要在myBean.download()方法返回StreamedContent的逻辑中,手动设置Cookie路径:
// 在download方法中添加如下代码 FacesContext facesContext = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); Cookie downloadCookie = new Cookie("primefaces.download", "true"); downloadCookie.setPath("/"); // 设为站点根路径适配所有页面 downloadCookie.setMaxAge(-1); response.addCookie(downloadCookie);
3. 确认组件可访问性
确保你定义的<p:remoteCommand>所在的组件没有被rendered=false隐藏,且:myComponentId是组件的绝对客户端ID,没有嵌套命名容器导致ID匹配错误。可在浏览器控制台执行document.getElementById(":myComponentId")验证ID是否正确。
4. 兜底兼容方案
如果上述方案仍不生效,可以用定时器轮询监测Cookie的方式替代原生monitorDownload,修改按钮的onclick逻辑即可:
<p:commandButton value="download" ajax="false" onclick="var checkDownload = setInterval(function(){ if(document.cookie.indexOf('primefaces.download') == -1){ clearInterval(checkDownload); stop(); } }, 500);" > <p:fileDownload value="#{myBean.download()}" /> </p:commandButton>
内容的提问来源于stack exchange,提问作者Marco Sulla
相关产品推荐
相关产品推荐

