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 1.3 和 Validation 验证插件1.5.1
Jul 09 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
javascript显示倒计时控制按钮的简单实现
Jun 07 Javascript
Vue.js每天必学之构造器与生命周期
Sep 05 Javascript
Node.js和Express简单入门介绍
Mar 24 Javascript
Node.js log4js日志管理详解
Jul 31 Javascript
vue-cli 打包使用history模式的后端配置实例
Sep 20 Javascript
Angular封装搜索框组件操作示例
Apr 25 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
May 16 Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
Aug 03 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
网页上facebook分享功能具体实现
2014/01/26 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
基于PHP制作验证码
2016/10/12 PHP
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
基于vue+echarts数据可视化大屏展示的实现
2020/12/25 Vue.js
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python读取键盘输入的2种方法
2015/06/16 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
瑜伽国际:Yoga International
2018/04/18 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
总经理助理岗位职责
2013/11/08 职场文书
英语自荐信常用语句
2013/12/13 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
中国梦团日活动总结
2014/07/07 职场文书
活动总结书怎么写
2015/05/11 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python