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的闭包
Jan 17 Javascript
Javascript中this的用法详解
Sep 22 Javascript
如何减少浏览器的reflow和repaint
Feb 26 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
js实现卡片式项目管理界面UI设计效果
Dec 08 Javascript
Vue自定义图片懒加载指令v-lazyload详解
Dec 31 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
利用JS制作万年历的方法
Aug 16 Javascript
实例详解JSON取值(key是中文或者数字)方式
Aug 24 Javascript
通过实践编写优雅的JavaScript代码
May 30 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
Jul 10 jQuery
vue-form表单验证是否为空值的实例详解
Oct 29 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下判断数组中是否存在相同的值array_unique
2008/03/25 PHP
PHP进程同步代码实例
2015/02/12 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
jquery 使用简明教程
2014/03/05 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
深入探讨javascript函数式编程
2015/10/11 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
Vue.js 表单校验插件
2016/08/14 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
详解Python中的正斜杠与反斜杠
2019/08/09 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
Python列表推导式实现代码实例
2020/09/09 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
怎样自定义一个异常类
2016/09/27 面试题
自我评价正确写法范文
2013/12/10 职场文书