소스 검색

support upload abort

baiyaaaaa 8 년 전
부모
커밋
b295e1b972
4개의 변경된 파일37개의 추가작업 그리고 6개의 파일을 삭제
  1. 3 2
      examples/docs/en-US/upload.md
  2. 1 0
      examples/docs/zh-CN/upload.md
  3. 8 0
      packages/upload/src/index.vue
  4. 25 4
      packages/upload/src/upload.vue

+ 3 - 2
examples/docs/en-US/upload.md

@@ -367,7 +367,8 @@ auto-upload | whether to auto upload file | boolean | — | true |
 http-request | override default xhr behavior, allowing you to implement your own upload-file's request | function | — | — |
 disabled | whether to disable upload | boolean | — | false |
 
-### Events
-| Event Name | Description | Parameters |
+### Methods
+| Methods Name | Description | Parameters |
 |---------- |-------- |---------- |
 | clearFiles | clear the uploaded file list | — |
+| abort | cancel upload request | ( file: fileList's item ) |

+ 1 - 0
examples/docs/zh-CN/upload.md

@@ -420,3 +420,4 @@
 | 方法名      | 说明          | 参数 |
 |---------- |-------------- | -- |
 | clearFiles | 清空已上传的文件列表 | — |
+| abort | 取消上传请求 | ( file: fileList 中的 file 对象 ) |

+ 8 - 0
packages/upload/src/index.vue

@@ -19,6 +19,10 @@ export default {
     IframeUpload
   },
 
+  provide: {
+    uploader: this
+  },
+
   props: {
     action: {
       type: String,
@@ -166,6 +170,7 @@ export default {
       if (raw) {
         file = this.getFile(raw);
       }
+      this.abort(file);
       var fileList = this.uploadFiles;
       fileList.splice(fileList.indexOf(file), 1);
       this.onRemove(file, fileList);
@@ -179,6 +184,9 @@ export default {
       });
       return target;
     },
+    abort(file) {
+      this.$refs['upload-inner'].abort(file);
+    },
     clearFiles() {
       this.uploadFiles = [];
     },

+ 25 - 4
packages/upload/src/upload.vue

@@ -3,6 +3,7 @@ import ajax from './ajax';
 import UploadDragger from './upload-dragger.vue';
 
 export default {
+  inject: ['uploader'],
   components: {
     UploadDragger
   },
@@ -47,7 +48,8 @@ export default {
 
   data() {
     return {
-      mouseover: false
+      mouseover: false,
+      reqs: {}
     };
   },
 
@@ -95,7 +97,23 @@ export default {
         this.onRemove(rawFile, true);
       }
     },
+    abort(file) {
+      const { reqs } = this;
+      if (file) {
+        let uid = file;
+        if (file.uid) uid = file.uid;
+        if (reqs[uid]) {
+          reqs[uid].abort();
+        }
+      } else {
+        Object.keys(reqs).forEach((uid) => {
+          if (reqs[uid]) reqs[uid].abort();
+          delete reqs[uid];
+        });
+      }
+    },
     post(rawFile) {
+      const { uid } = rawFile;
       const options = {
         headers: this.headers,
         withCredentials: this.withCredentials,
@@ -108,14 +126,17 @@ export default {
         },
         onSuccess: res => {
           this.onSuccess(res, rawFile);
+          delete this.reqs[uid];
         },
         onError: err => {
           this.onError(err, rawFile);
+          delete this.reqs[uid];
         }
       };
-      const requestPromise = this.httpRequest(options);
-      if (requestPromise && requestPromise.then) {
-        requestPromise.then(options.onSuccess, options.onError);
+      const req = this.httpRequest(options);
+      this.reqs[uid] = req;
+      if (req && req.then) {
+        req.then(options.onSuccess, options.onError);
       }
     },
     handleClick() {