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学习笔记之 Ajax操作篇(二) - 数据传递
Jun 23 Javascript
js实现遮罩层划出效果是生成div而不是显示
Jul 29 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
Mar 29 jQuery
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
详解VS Code使用之Vue工程配置format代码格式化
Mar 20 Javascript
Vuex中实现数据状态查询与更改
Nov 08 Javascript
vue移动端模态框(可传参)的实现
Nov 20 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
Sep 11 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 expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
XENON基于JSON变种
2010/07/27 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
使用Python制作微信跳一跳辅助
2018/01/31 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
pow在python中的含义及用法
2019/07/11 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
Python线程threading模块用法详解
2020/02/26 Python
vue常用指令代码实例总结
2020/03/16 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
科室工作个人总结的自我评价
2013/10/29 职场文书
领班岗位职责范文
2014/02/06 职场文书
元旦活动感言
2014/03/08 职场文书
经典商业广告词
2014/03/13 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
积极向上的团队口号
2014/06/06 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
业务员岗位职责范本
2015/04/03 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android