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 相关文章推荐
基于jquery实现的表格分页实现代码
Jun 21 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
jQuery的Ajax的自动完成功能控件简要说明
Feb 22 Javascript
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
AngularJS ng-mousedown 指令
Aug 02 Javascript
Javascript前端经典的面试题及答案
Mar 14 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
详解操作虚拟dom模拟react视图渲染
Jul 25 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
js实现弹窗效果
Aug 09 Javascript
vue接口请求加密实例
Aug 11 Javascript
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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php阳历转农历优化版
2016/08/08 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
xtree.js 代码
2007/03/13 Javascript
Javascript 学习书 推荐
2009/06/13 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
法制宣传口号
2014/06/16 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
辞职信怎么写
2015/02/27 职场文书
保研导师推荐信
2015/03/25 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
区域销售大会开幕词
2016/03/04 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android