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 load方法用法集锦
Dec 06 Javascript
javascript五图轮播切换实用版
Aug 17 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
node.js中的events.emitter.once方法使用说明
Dec 10 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
JSON与XML优缺点对比分析
Jul 17 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
May 31 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
Oct 24 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
vue2.0 路由模式mode=&quot;history&quot;的作用
Oct 18 Javascript
详解Vscode中使用Eslint终极配置大全
Nov 08 Javascript
vue ssr+koa2构建服务端渲染的示例代码
Mar 23 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验证码类代码分享(已封装成类)
2011/07/17 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
常用的js方法合集
2017/03/10 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
详解Java中String JSONObject JSONArray List转换
2020/11/13 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
详解Python中的正则表达式的用法
2015/04/09 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
详解用python生成随机数的几种方法
2019/08/04 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
考试没考好检讨书
2014/01/31 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js