AngularJS实现图片上传和预览功能的方法分析


Posted in Javascript onNovember 08, 2017

本文实例讲述了AngularJS实现图片上传和预览功能的方法。分享给大家供大家参考,具体如下:

html5原生方法

先看一下html5原生方法上传和预览图片的实现:

// <img id="img-preview">
var imgPreview = document.getElementById("img-preview");
// <input id="img-input" type="file">
var imgInput= document.getElementById("img-input");
imgInput.addEventListener("change", function(e){
 var imgFile = e.target.files[0]; // 获取上传的图片
 var reader = new FileReader();
 reader.readAsDataURL(imgFile ); // 将图片转成dataUri
 reader.onload = function(e) {
  imgPreview.src = e.target.result; //更新图片链接
 }
});

我们看到,需要用到onchange事件来获得上传的文件,当项目使用上angularjs时,很自然的,我们想到了ng-change指令,然而不幸的是,在angularjs中,<input type="file">不支持ng-model和ng-change指令(附录1),这就使得文件上传变得有些复杂了。

angularjs方法

这里使用开源的 angular-file-upload 模块来实现,步骤如下:

1、安装 angular-file-upload 模块

bower install angular-file-upload --save

2、添加到应用依赖

var app = angular.module('my-app', [
  'angularFileUpload'
]);

3、HTML代码

<!--文件上传指令-->
<input type="file" nv-file-select="" uploader="uploader" />
<!--图片预览-->
<img id="img-preview" ng-src="{{iconUrl}}">

这里,nv-file-select=""表示使用angular-file-upload模块的文件选择方式上传,参考官方例子

4、controller代码

.controller('AppController', ['$scope', 'FileUploader', function($scope, FileUploader) {
    var uploader = $scope.uploader = new FileUploader({
      url: 'upload.php' //换成自己的上传地址,本地演示不换也行
    });
    uploader.onAfterAddingFile = function(fileItem) {
      var reader = new FileReader();
      reader.addEventListener("load", function (e) {
        //文件加载完之后,更新angular绑定
        $scope.$apply(function(){
          $scope.iconUrl = e.target.result;
        });
      }, false);
      reader.readAsDataURL(fileItem._file);
    };
}]);

可以看到,我们通过onAfterAddingFile回调函数获得所选的图片文件,接下来把图片文件转成datauri,再更新<img>标签的src属性即可。

值得注意的是,我们把“更新<img>标签的src属性”这个任务放到了$scope.$apply方法中执行,这是因为在angular框架外部(如在浏览器DOM事件中, setTimeout, XHR 或者 第三方框架中)更新数据,angular是不会同步更新绑定的。这点可以参考angular $apply reference

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
javascript检查日期格式的函数[比较全]
Oct 17 Javascript
页面使用密码保护代码
Apr 10 Javascript
JavaScript中提前声明变量或函数例子
Nov 12 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
拥Bootstrap入怀——导航栏篇
May 30 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
Aug 02 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
Mar 08 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
vue 设置 input 为不可以编辑的实现方法
Sep 19 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
Vue实现todo应用的示例
Feb 20 Vue.js
javascript自定义事件功能与用法实例分析
Nov 08 #Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 #jQuery
ES6中javascript实现函数绑定及类的事件绑定功能详解
Nov 08 #Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 #Javascript
vue中实现滚动加载更多的示例
Nov 08 #Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 #Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 #Javascript
You might like
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
php提取微信账单的有效信息
2018/10/01 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
基于jquery自定义图片热区效果
2012/07/21 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python之语音识别speech模块
2020/09/09 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
美国NBA官方商店:NBA Store
2019/04/12 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
联谊会主持词
2014/03/26 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
学校交通安全责任书
2014/08/25 职场文书
大学生党性分析材料
2014/12/19 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js