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脚本性能优化注意事项
Nov 18 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
Dec 20 Javascript
JS中的异常处理方法分享
Dec 22 Javascript
详解如何较好的使用js
Dec 16 Javascript
jquery easyui DataGrid简单示例
Jan 23 Javascript
vue实现ToDoList简单实例
Feb 07 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
详解vue-element Tree树形控件填坑路
Mar 26 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
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中call_user_func_array()函数的用法演示
2012/02/05 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
php多文件上传实现代码
2014/02/20 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python编程之属性和方法实例详解
2015/05/19 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
建材业务员岗位职责
2013/12/08 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
个人工作保证书
2015/02/28 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
女儿满月酒致辞
2015/07/29 职场文书
MySQL约束超详解
2021/09/04 MySQL