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 相关文章推荐
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
JS清除IE浏览器缓存的方法
Jul 26 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
May 28 Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 Javascript
vue-resource 拦截器使用详解
Feb 21 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
Jan 08 jQuery
详解vscode中vue代码颜色插件
Oct 11 Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
Sep 10 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制作新闻系统的思路
2006/10/09 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
angular4应用中输入的最小值和最大值的方法
2019/05/17 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
python安装教程
2018/02/28 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
音乐专业应届生教师求职信
2013/11/04 职场文书
大学专科生推荐信范文
2013/11/23 职场文书
办公室经理岗位职责
2014/01/01 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书