Angularjs注入拦截器实现Loading效果


Posted in Javascript onDecember 28, 2015

angularjs作为一个全ajax的框架,对于请求,如果页面上不做任何操作的话,在结果烦回来之前,页面是没有任何响应的,不像普通的HTTP请求,会有进度条之类。

什么是拦截器?

$httpProvider 中有一个 interceptors 数组,而所谓拦截器只是一个简单的注册到了该数组中的常规服务工厂。下面的例子告诉你怎么创建一个拦截器:

<!-- lang: js -->
module.factory('myInterceptor', ['$log', function($log) {
 $log.debug('$log is here to show you that this is a regular factory with injection');
 var myInterceptor = {
  ....
  ....
  ....
 };
 return myInterceptor;
}]);

然后通过它的名字添加到 $httpProvider.interceptors 数组:

<!-- lang: js -->
module.config(['$httpProvider', function($httpProvider) {
 $httpProvider.interceptors.push('myInterceptor');
}]);

先给大家展示下效果图:

Angularjs注入拦截器实现Loading效果

本文通过对httpProvider注入拦截器实现loading。

html代码

<div class="loading-modal modal" ng-if="loading">
 <div class="loading">
  <img src="<?=$this->module->getAssetsUrl()?>/img/loading.gif" alt=""/><span ng-bind="loading_text"></span>
 </div>
</div>

css代码

.modal {
 position: fixed;
 width: 100%;
 height: 100%;
 left: 0;
 top: 0;
 z-index: 99;
 background: rgba(0, 0, 0, 0.3);
 overflow: hidden;
}
.loading {
 position: absolute;
 top: 50%;
 background: white;
 #solution> .border-radius(8px);
 width: 160px;
 height: 72px;
 left: 50%;
 margin-top: -36px;
 margin-left: -80px;
 text-align: center;
 img {
 margin-top: 12px;
 text-align: center;
 }
 span {
 display: block;
 }
}

js代码

app.config(["$routeProvider", "$httpProvider", function ($routeProvider, $httpProvider) {
 $routeProvider.when('/', {
  templateUrl: "/views/reminder/index.html",
  controller: "IndexController"
 });
 $routeProvider.when('/create', {
  templateUrl: "/views/reminder/item/create.html",
  controller: "ItemCreateController"
 });
 $routeProvider.otherwise({redirectTo: '/'});
 $httpProvider.interceptors.push('timestampMarker');
}]);
//loading
app.factory('timestampMarker', ["$rootScope", function ($rootScope) {
 var timestampMarker = {
  request: function (config) {
   $rootScope.loading = true;
   config.requestTimestamp = new Date().getTime();
   return config;
  },
  response: function (response) {
   // $rootScope.loading = false;
   response.config.responseTimestamp = new Date().getTime();
   return response;
  }
 };
 return timestampMarker;
}]);

拦截器允许你:

通过实现 request 方法拦截请求: 该方法会在 $http 发送请求道后台之前执行,因此你可以修改配置或做其他的操作。该方法接收请求配置对象(request configuration object)作为参数,然后必须返回配置对象或者 promise 。如果返回无效的配置对象或者 promise 则会被拒绝,导致 $http 调用失败。

通过实现 response 方法拦截响应: 该方法会在 $http 接收到从后台过来的响应之后执行,因此你可以修改响应或做其他操作。该方法接收响应对象(response object)作为参数,然后必须返回响应对象或者 promise。响应对象包括了请求配置(request configuration),头(headers),状态(status)和从后台过来的数据(data)。如果返回无效的响应对象或者 promise 会被拒绝,导致 $http 调用失败。

通过实现 requestError 方法拦截请求异常: 有时候一个请求发送失败或者被拦截器拒绝了。请求异常拦截器会俘获那些被上一个请求拦截器中断的请求。它可以用来恢复请求或者有时可以用来撤销请求之前所做的配置,比如说关闭进度条,激活按钮和输入框什么之类的。

通过实现 responseError 方法拦截响应异常: 有时候我们后台调用失败了。也有可能它被一个请求拦截器拒绝了,或者被上一个响应拦截器中断了。在这种情况下,响应异常拦截器可以帮助我们恢复后台调用。

Javascript 相关文章推荐
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
js 幻灯片的实现
Dec 06 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
Apr 15 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
Jan 09 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
Feb 07 Javascript
JS实现数组去重复值的方法示例
Feb 18 Javascript
原生JS实现$.param() 函数的方法
Aug 10 Javascript
vue实现一拉到底的滑动验证
Jul 25 Javascript
2019最新21个MySQL高频面试题介绍
Feb 06 Javascript
AngularJS进行性能调优的7个建议
Dec 28 #Javascript
浅析AngularJS Filter用法
Dec 28 #Javascript
jquery实现倒计时功能
Dec 28 #Javascript
基于jquery实现瀑布流布局
Jun 28 #Javascript
详解AngularJS Filter(过滤器)用法
Dec 28 #Javascript
原生JavaScript实现瀑布流布局
Jun 28 #Javascript
js实现瀑布流的三种方式比较
Jun 28 #Javascript
You might like
PHP编码转换
2012/11/05 PHP
PHP中常用的转义函数
2014/02/28 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
python各种语言间时间的转化实现代码
2016/03/23 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
python爬取网易云音乐评论
2018/11/16 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
德语专业求职信
2014/03/12 职场文书
合作协议书模板2014
2014/09/26 职场文书
紧急迫降观后感
2015/06/15 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
Golang入门之计时器
2022/05/04 Golang