验证Kendo Upload控件:表单提交前需确认上传完成,求替代方案
Kendo Upload 表单提交时的上传状态管控方案
你的初始方案(用变量配合e.preventDefault()拦截提交、追踪上传状态)是完全可行的,这里再分享几个更贴合Kendo Upload组件特性的实现思路,供你参考:
思路一:利用组件内置API直接获取上传状态
Kendo Upload本身提供了getFiles()方法,可直接获取所有文件的实时状态,无需额外维护变量,能避免状态不同步的问题:
$("#submitBtn").on("click", function(e) { const upload = $("#files").data("kendoUpload"); // 筛选出正在上传的文件 const uploadingFiles = upload.getFiles().filter(file => file.status === "uploading"); if (uploadingFiles.length > 0) { e.preventDefault(); alert("文件正在上传中,请等待完成后再提交表单"); } });
思路二:动态禁用/启用提交按钮
从根源上避免误操作:上传开始时禁用提交按钮,所有上传任务完成(或文件被移除后无待上传任务)时再启用按钮:
const upload = $("#files").kendoUpload({ upload: function() { $("#submitBtn").prop("disabled", true); }, complete: function() { // 检查是否还有未完成的上传任务 const hasUploading = this.getFiles().some(file => file.status === "uploading"); if (!hasUploading) { $("#submitBtn").prop("disabled", false); } }, remove: function() { // 文件被移除后也要检查状态 const hasUploading = this.getFiles().some(file => file.status === "uploading"); if (!hasUploading) { $("#submitBtn").prop("disabled", false); } } }).data("kendoUpload");
思路三:结合Promise机制处理异步上传
如果需要在上传完成后自动触发表单提交,可以把每个上传任务包装成Promise,提交时等待所有任务完成:
let uploadTasks = []; const upload = $("#files").kendoUpload({ upload: function(e) { // 为每个上传任务创建Promise const task = new Promise((resolve, reject) => { e.data = { resolve, reject }; }); uploadTasks.push(task); }, success: function(e) { e.data.resolve(); }, error: function(e) { e.data.reject(); }, complete: function() { // 清理已完成的任务 uploadTasks = uploadTasks.filter(t => t.status !== "fulfilled" && t.status !== "rejected"); } }).data("kendoUpload"); $("#submitBtn").on("click", async function(e) { if (uploadTasks.length > 0) { e.preventDefault(); alert("文件正在上传中,完成后将自动提交表单"); // 等待所有上传完成后自动提交 await Promise.allSettled(uploadTasks); $("#yourForm").submit(); } });
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

