【问题标题】:Oncomplete of Primefaces component fileUpload is never called永远不会调用 Primefaces 组件文件上传的 Oncomplete
【发布时间】:2017-05-29 06:51:46
【问题描述】:

我的页面上有一个表单上传组件,我想在文件上传完成和页面更新后在 JavaScript 中进行更多操作。

我放置了简单的日志语句来测试“oncomplete”执行,但它从未发生过。 文件已成功上传且页面的其他部分已更新,但未执行“未完成”操作。 这是我的组件:

<p:fileUpload id="objectUpload1"
                fileUploadListener="#{importBackingBean.handleFileUpload}"
                mode="advanced" dragDropSupport="true"
                invalidFileMessage="Недопустимый тип файла"
                invalidSizeMessage="Размер файла превышает 5 МВ"
                cancelLabel="#{msg['stop_LABEL']}"
                uploadLabel="#{msg['Upload_LABEL']}"
                label="#{msg['Choose_LABEL']}" update="results objects_Data"
                sizeLimit="5000000" allowTypes="/(\.|\/)(xlsx|xls)$/"
                oncomplete="load();" />

还有我的 Javascript:

<script type="text/javascript">
                function load() {
                    console.log('File Uploaded!');
                    $("button[id*='load']").click();
                }                       
</script>

按钮:

<p:commandButton value="Загрузить полисы"                   
                oncomplete="#{importModelBean.needToLoadMore ? 'load();' :'none();'}"
                id="load"
                action="#{importBackingBean.loadOneRow(importModelBean.current)}"
                process="@this" update="mainViewForm:objects_Data" />

当我手动单击按钮时,它工作得很好。但文件加载完成后没有被点击。

【问题讨论】:

  • 我手头没有文档,但你确定oncomplete 是这样支持的吗?
  • @Kukeltje - 是的,Primefaces 中的文件上传支持 oncomplete。这是documentation
  • 我知道文档在哪里 ;-) juat not goung 无法访问我手机上的几 MB 大文件...稍后将在家里检查

标签: jsf file-upload primefaces


【解决方案1】:

使用给定的代码,我重现了这个场景。虽然$("button[id*='load']").click(); 已被正确调用,但没有显示任何日志。我猜ID为load的按钮设置为ajax=”false”。如果这是真的,那么我认为在调用console.log('File Uploaded!'); 时记录了该消息,但由于页面在加载按钮过程后更新而被清除。你需要日志吗?如果没有,只需删除 console.log('File Uploaded!'); 代码,它应该可以正常工作。

编辑:

我误会你了。我认为您担心的是该消息未记录在控制台中。

我已经在两个项目(在两台不同的计算机上运行)测试了您的代码,但我无法重现您的问题。

项目 1:
Primefaces 6.0
JSF 2.0
是 8.5
IE 11

项目 2:
Primefaces 5.x
JSF 2.0
Glassfish 4.1
谷歌浏览器

我什至试过oncomplete=”alert(‘hello!’)”,效果很好。

我认为问题出在其他地方。 同时,您可以尝试以下代码,看看它是否有效:

<p:fileUpload id="objectUpload1"
                fileUploadListener="#{importBackingBean.handleFileUpload}"
                mode="advanced" dragDropSupport="true"
                invalidFileMessage="Недопустимый тип файла"
                invalidSizeMessage="Размер файла превышает 5 МВ"
                cancelLabel="#{msg['stop_LABEL']}"
                uploadLabel="#{msg['Upload_LABEL']}"
                label="#{msg['Choose_LABEL']}" update="results objects_Data"
                sizeLimit="5000000" allowTypes="/(\.|\/)(xlsx|xls)$/"
                oncomplete="rc()" />

<p:remoteCommand name="rc"                
                oncomplete="#{importModelBean.needToLoadMore ? 'load();' :'none();'}"
                action="#{importBackingBean.loadOneRow(importModelBean.current)}"
                process="@this" update="mainViewForm:objects_Data" />

有关p:remoteCommand的更多信息,请参阅primefaces展示RemoteCommand

【讨论】:

  • 文件上传后只更新两个块(results 和 objects_Data),而不是整个页面。按钮是 p:commandButton - 所以 Ajax 默认为 true,我没有将其设置为 false(代码示例已更新)。如果我手动单击按钮,按钮会起作用,但 oncomplete 不会。
  • 我的评论太长了,所以我编辑了我之前的答案。请参阅编辑:部分。
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多