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 相关文章推荐
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
js实现a标签超链接提交form表单的方法
Jun 24 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
Aug 31 Javascript
jQuery简单实现提交数据出现loading进度条的方法
Mar 29 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
Vue自定义指令详解
Jul 28 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
Sep 20 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 Javascript
使用js实现将后台传入的json数据放在前台显示
Aug 06 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 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 session应用实例 登录验证
2009/03/16 PHP
几款免费开源的不用数据库的php的cms
2010/12/19 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
Laravel路由研究之domain解决多域名问题的方法示例
2019/04/04 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
three.js中文文档学习之创建场景
2017/11/20 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
js实现表格数据搜索
2020/08/09 Javascript
用vue写一个日历
2020/11/02 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
Python标准库defaultdict模块使用示例
2015/04/28 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
一份创业计划书范文
2014/02/08 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
《穷人》教学反思
2014/04/08 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
基于python制作简易版学生信息管理系统
2021/04/20 Python
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
Win11更新失败并提示0xc1900101
2022/04/19 数码科技