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 相关文章推荐
jquery 学习之二 属性 文本与值(text,val)
Nov 25 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
Sep 02 Javascript
让元素在网页中可拖动示例代码
Aug 13 Javascript
使用JavaScript 实现的人脸检测
Mar 24 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
JQuery实现级联下拉框效果实例讲解
Sep 17 Javascript
JS实现touch 点击滑动轮播实例代码
Jan 19 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
vue 巧用过渡效果(小结)
Sep 22 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
Jun 11 Javascript
js中延迟加载和预加载的具体使用
Jan 14 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
PHP 读取和编写 XML
2014/11/19 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
js快速排序的实现代码
2013/12/08 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
python中lambda与def用法对比实例分析
2015/04/30 Python
python Django批量导入不重复数据
2016/03/25 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
Python内建模块struct实例详解
2018/02/02 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
应聘编辑职位自荐信范文
2014/01/05 职场文书
中学校庆方案
2014/03/17 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
python模板入门教程之flask Jinja
2022/04/11 Python