Angular angular-file-upload文件上传的示例代码


Posted in Javascript onAugust 23, 2018

问题描述

附件上传

检定结果以附件形式上传。

Angular angular-file-upload文件上传的示例代码

这里先不考虑api

实现的任务就是,点击选择文件,选择之后可以清楚掉该文件。

插件介绍

用到了项目映入过的一个插件,angular-file-upload。

angular-file-upload AP:https://github.com/nervgh/angular-file-upload

进入正题,我们如何安装,还是老样子安利波npm

npm install angular-file-upload

插件很简单,就是一个指令,我们在它提供给我们的指令中声明一个uploader对象,这个对象表示在不同的时间下要执行什么操作,另一种观察者模式。

功能实现

使用指令

官网给出了该指令的很多种用法,这里选择最简单的,Single,单文件上传。

Angular angular-file-upload文件上传的示例代码

<input type="file" nv-file-select uploader="uploader"/>

一个file类型的input,使用nv-file-select指令,传给该指令一个uploader对象作为参数。

很简单的逻辑,新建一个FileUploader的对象,然后重写它的onAfterAddingFile方法,就是在文件添加完成之后,也就是点击选择文件,选中文件,点击完成之后执行的一个方法。

此方法中我们直接对文件进行上传操作。

// 新建文件上传实例
self.uploader = new FileUploader();

// 重写文件添加后的方法
self.uploader.onAfterAddingFile = function(fileItem) {
  // 打印日志
  if (config.debug) { console.info('onAfterAddingFile', fileItem); }
  // 上传文件
  self.upload(fileItem);
};

// 传给视图
$scope.uploader = self.uploader;

如果将文件上传封装成指令,以上代码应该方法指令的controller方法中执行!!!

关于指令中的compilecontrollerlink的执行详解,请参考正确地使用 Angular Directive 中的 compile,controller 与 link。

原因分析

可能是nv-file-select指令在实现时在link函数中进行各种事件的绑定,绑定时就需要我们的uploader对象。

而如果我们将其放在了link函数里,该指令的link函数是晚于nv-file-selectlink函数执行的,所以无效。

upload

// 上传文件
self.upload = function(data) {
  // 上传文件
  AttachmentService.uploadFile(data._file)
    .then(function success(response) {
        // 将上传成功的附件绑定再ngModel中
        $scope.ngModel = response.data;
        // 显示上传按钮
        self.showClear();
      }, function error() {
        // 提示用户上传失败
        sweetAlert.swal({
          title: "对不起",
          text: "上传的附件不能大于1M,请确认附件是否大于1M"
        });
      });
};

清空

用户上传错了文件怎么办呢?添加一个清空按钮,如果上传文件之后就显示。

// 清空选中文件
self.clear = function() {
  self.deleteFile(scope.ngModel.id);
};

// 删除附件
self.deleteFile = function(id) {
  AttachmentService.deleteFile(id, function success() {
    // 将附件赋为空对象
    scope.ngModel = undefined;
    // 隐藏清空按钮
    self.hideClear();
  });
};

scope.clear = self.clear;

但是这里会有一个问题,这里仅仅是删除了服务器上的附件,而文件的选中效果还是在的,这里还是显示选中的文件名的。

Angular angular-file-upload文件上传的示例代码

解决方案就是用一个form把它套起来,将button的类型设置为reset,点击按钮时,就会清空input中的内容了。

<form name="formInner" novalidate>
  <fieldset>
    <label class="col-sm-4 control-label">附件</label>
    <div class="col-sm-4">
      <input type="file" nv-file-select uploader="uploader"/>
    </div>
    <div class="col-md-4">
      <button type="reset" ng-if="params.showClearOrNot" ng-click="clear()" class="btn btn-xs btn-default">清除</button>
    </div>
  </fieldset>
</form>
<form>
  <input ng-model="xxx" />
  <yunzhi-upload-file ng-model="work.apply.attachment"></yunzhi-upload-file>
</form>

设置为reset之后就会出现新的问题,因为是在一个form表单里套的这个指令,所以reset,将其他的也都清空了。

ng-form

ng-form解决了问题。

这是ng-form指令的官方解释:

HTML does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a sub-group of controls needs to be determined.

HTML不允许嵌套form元素,ng-form被用来嵌套form,如果一个子的form组需要被验证。

但是ng-form并没有实现form的功能,ng-submit就不能使用,想想这样设计也是合理的,如果ng-form也能submit,嵌套form,一个submitbutton,提交谁?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
js控制href内容的连接内容的变化示例
Apr 30 Javascript
JavaScript function 的 length 属性使用介绍
Sep 15 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
js实现类似新浪微博首页内容渐显效果的方法
Apr 10 Javascript
javascript实现确定和取消提示框效果
Jul 10 Javascript
Javascript调试之console对象——你不知道的一些小技巧
Jul 10 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
Dec 12 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
JS实现的简单分页功能示例
Aug 23 #Javascript
JavaScript实用代码小技巧
Aug 23 #Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 #jQuery
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 #Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
Aug 22 #Javascript
Vue.js点击切换按钮改变内容的实例讲解
Aug 22 #Javascript
Vue2.0点击切换类名改变样式的方法
Aug 22 #Javascript
You might like
PHP的博客ping服务代码
2012/02/04 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
运动会致辞稿50字
2014/02/04 职场文书
幼儿园家长寄语
2014/04/02 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
TS 类型收窄教程示例详解
2022/09/23 Javascript