AngualrJS中每次$http请求时的一个遮罩层Directive_AngularJS

AngularJS是一款非常强大的前端MVC框架。在AngualrJS中使用$http每次向远程API发送请求,等待响应,这中间有些许的等待过程。如何优雅地处理这个等待过程呢?

如果我们在等待过程中弹出一个遮罩层,会是一个比较优雅的做法。

这就涉及到了对$http的请求响应进行拦截了。请求的时候,弹出一个遮罩层,收到响应的时候把遮罩层隐藏。

其实,$httpProvider已经为我们提供了一个$httpProvider.interceptors属性,我们只需要把自定义的拦截器放到该集合中就可以了。

如何表现呢?大致是这样的:

<div data-my-overlay>
<br/><img src="spinner.gif" />   Loading
</div> 

显示加载的图片被包含在Directive中了,肯定会用到transclusion。

还涉及到一个遮罩层弹出延迟时间的问题,这个我们希望在config中通过API设置,所以,我们有必要创建一个provider,通过这个设置延迟时间。

$http请求响应遮罩层的Directive:

(function(){
var myOverlayDirective =function($q, $timeout, $window, httpInterceptor, myOverlayConfig){
return {
restrict: 'EA',
transclude: true,
scope: {
myOverlayDelay: "@"
},
template: '<div id="overlay-container" class="onverlayContainer">' +
'<div id="overlay-background" class="onverlayBackground"></div>' +
'<div id="onverlay-content" class="onverlayContent" data-ng-transclude>' +
'</div>' +
'</div>',
link: function(scope, element, attrs){
var overlayContainer = null,
timePromise = null,
timerPromiseHide = null,
inSession = false,
queue = [],
overlayConfig = myOverlayConfig.getConfig();
init();
//初始化
function init(){
wireUpHttpInterceptor();
if(window.jQuery) wirejQueryInterceptor();
overlayContainer = document.getElementById('overlay-container');
}
//自定义Angular的http拦截器
function wireUpHttpInterceptor(){
//请求拦截
httpInterceptor.request = function(config){
//判断是否满足显示遮罩的条件
if(shouldShowOverlay(config.method, config.url)){
processRequest();
}
return config || $q.when(config);
};
//响应拦截
httpInterceptor.response = function(response){
processResponse();
return response || $q.when(response);
}
//异常拦截
httpInterceptor.responseError = function(rejection){
processResponse();
return $q.reject(rejection);
}
}
//自定义jQuery的http拦截器
function wirejQueryInterceptor(){
$(document).ajaxStart(function(){
processRequest();
});
$(document).ajaxComplete(function(){
processResponse();
});
$(document).ajaxError(function(){
processResponse();
});
}
//处理请求
function processRequest(){
queue.push({});
if(queue.length == 1){
timePromise = $timeout(function(){
if(queue.length) showOverlay();
}, scope.myOverlayDelay ? scope.myOverlayDelay : overlayConfig.delay);
}
}
//处理响应
function processResponse(){
queue.pop();
if(queue.length == 0){
timerPromiseHide = $timeout(function(){
hideOverlay();
if(timerPromiseHide) $timeout.cancel(timerPromiseHide);
},scope.myOverlayDelay ? scope.myOverlayDelay : overlayConfig.delay);
}
}
//显示遮罩层
function showOverlay(){
var w = 0;
var h = 0;
if(!$window.innerWidth){
if(!(document.documentElement.clientWidth == 0)){
w = document.documentElement.clientWidth;
h = document.documentElement.clientHeight;
} else {
w = document.body.clientWidth;
h = document.body. clientHeight;
}
}else{
w = $window.innerWidth;
h = $window.innerHeight;
}
var content = docuemnt.getElementById('overlay-content');
var contetWidth = parseInt(getComputedStyle(content, 'width').replace('px',''));
var contentHeight = parseInt(getComputedStyle(content, 'height').replace('px',''));
content.style.top = h / 2 - contentHeight / 2 + 'px';
content.style.left = w / 2 - contentWidth / 2 + 'px';
overlayContainer.style.display = 'block';
}
function hideOverlay(){
if(timePromise) $timeout.cancel(timerPromise);
overlayContainer.style.display = 'none';
}
//得到一个函数的执行结果
var getComputedStyle = function(){
var func = null;
if(document.defaultView && document.defaultView.getComputedStyle){
func = document.defaultView.getComputedStyle;
} else if(typeof(document.body.currentStyle) !== "undefined"){
func = function(element, anything){
return element["currentStyle"];
}
}
return function(element, style){
reutrn func(element, null)[style];
}
}();
//决定是否显示遮罩层
function shouldShowOverlay(method, url){
var searchCriteria = {
method: method,
url: url
};
return angular.isUndefined(findUrl(overlayConfig.exceptUrls, searchCriteria));
}
function findUrl(urlList, searchCriteria){
var retVal = undefined;
angular.forEach(urlList, function(url){
if(angular.equals(url, searchCriteria)){
retVal = true;
return false;//推出循环
}
})
return retVal;
}
}
}
};
//配置$httpProvider
var httpProvider = function($httpProvider){
$httpProvider.interceptors.push('httpInterceptor');
};
//自定义interceptor
var httpInterceptor = function(){
return {};
};
//提供配置
var myOverlayConfig = function(){
//默认配置
var config = {
delay: 500,
exceptUrl: []
};
//设置延迟
this.setDelay = function(delayTime){
config.delay = delayTime;
}
//设置异常处理url
this.setExceptionUrl = function(urlList){
config.exceptUrl = urlList;
};
//获取配置
this.$get = function(){
return {
getDelayTime: getDelayTime,
getExceptUrls: getExceptUrls,
getConfig: getConfig
}
function getDelayTime(){
return config.delay;
}
function getExeptUrls(){
return config.exceptUrls;
}
function getConfig(){
return config;
}
};
};
var myDirectiveApp = angular.module('my.Directive',[]);
myDirectiveApp.provider('myOverlayConfig', myOverlayConfig);
myDirectiveApp.factory('httpInterceptor', httpInterceptor);
myDirectiveApp.config('$httpProvider', httpProvider);
myDirectiveApp.directive('myOverlay', ['$q', '$timeout', '$window', 'httpInceptor', 'myOverlayConfig', myOverlayDirective]);
}()); 

在全局配置中:

(functioin(){
angular.module('customersApp',['ngRoute', 'my.Directive'])
.config(['$routeProvider, 'myOverlayConfigProvider', funciton($routeProvider, myOverlayConfigProvider){
...
myOverlayConfigProvider.setDealy(100);
myOverlayConfigProvider.setExceptionUrl({
method: 'GET',
url: ''
});
}]);
}());

以上所述是小编给大家分享的AngualrJS中每次$http请求时的一个遮罩层Directive ,希望对大家有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索angularjs_directive
angularjs请求遮罩层、angualr directive、angualrjs directive、angualr2 directive、angularjs实现遮罩层,以便于您获取更多的相关知识。

时间: 2024-10-27 22:02:51

AngualrJS中每次$http请求时的一个遮罩层Directive_AngularJS的相关文章

http-使用angualrjs $Http.post发送请求时 angular.path 参数表示什么意思

问题描述 使用angualrjs $Http.post发送请求时 angular.path 参数表示什么意思 使用angualrjs $Http.post发送请求时 angular.path 参数表示什么意思 解决方案 为什么没有人回答呢???????????????????

代码-&amp;amp;lt;a&amp;amp;gt;链接一个遮罩层。遮罩层弹出DIV ,DIV在页面隐藏

问题描述 <a>链接一个遮罩层.遮罩层弹出DIV ,DIV在页面隐藏 DIV在页面隐藏.在弹出遮罩层后显示页面中隐藏的DIV 怎么实现? 有代码吗? 解决方案 弹出遮罩层之后,display改为block或者直接show()就行啊. 解决方案二: 设置div的css中z-index属性值,值越大的覆盖在上层显示.

分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出

分布式系统中的RPC请求经常出现乱序的情况.  写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:  1  2  3, 4, 5  6  7, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 要求:  1. 写一个高效的算法完成上述功能,实现要尽可能的健壮.易于维护  2. 为该算法设计并实现单元测试 我的思路是:  假设输入

多线程-在编写一个从谷歌下载影像图的程序,下载过程中,网速时快时慢,求高手指点

问题描述 在编写一个从谷歌下载影像图的程序,下载过程中,网速时快时慢,求高手指点 这个程序开了多线程,一张图片一张图片的下载,如果,下载失败,在While循环里,Sleep一下,直到下载成功,才退出循环,这样确保每一张图片下载成功,求高手指点啊,是不是线程开得太多了,有一百多个,还是while循环处理的问题 解决方案 100多线程没有什么意义,10个线程基本上就够了. sleep会导致当前线程休眠,看你是不是用错了. 解决方案二: 线程内处理代码如下: bool bDownLoad = CTil

ajax-.net中怎样把从http请求到的一个完整页面内容,添加到另外一个页面中

问题描述 .net中怎样把从http请求到的一个完整页面内容,添加到另外一个页面中 我用Ajax请求远程接口,接口返回一串内容,内容就是一个页面的完整代码,我怎样把这个代码放到另外一个页面上,求高人指点 解决方案 在另外的页面上放一个div 然后将AJAX返回的结果付给此div.innerhtml 解决方案二: 创建一个iframe等,然后把页面内容设置进去 解决方案三: 添加是没有任何问题,关键是添加以后不能把版面弄乱了.毕竟你是把驴嘴安在马脸上.所以最好还是用框架网页,提高兼容性. 解决方案

图片-在java ee的一个案例中,登录页面时出现乱码,怎么回事呢?

问题描述 在java ee的一个案例中,登录页面时出现乱码,怎么回事呢? 解决方案 检查一下页面的编码是否是gb2312.gbk.utf-8等. 解决方案二: 服务器的编码设置是否也是utf-8? 解决方案三: 一个是工作空间的编码设成utf-8的 还有就是页面的编码格式也要设置成utf-8的试试呢 解决方案四: 写个过滤器也是可以的 解决方案五: 工作空间的编码集设置.项目的编码集设置.jsp页面上的编码集设置.response的contenttype,response的characterEn

AngualrJS中的Directive制作一个菜单_AngularJS

说下我经常写菜单的方式: <ul> <li data-ng-class="{'active': highlight('/orders')}"> <a href="#/orders">Orders</a> </li> </ul> 菜单项是否高亮显示取决于controller中的highlight方法. vm.highlight = funciton(path){ return $locaiton.

服务器-调用一个新闻接口时,每次只有第一次请求时能获取到数据

问题描述 调用一个新闻接口时,每次只有第一次请求时能获取到数据 我在使用http://apistore.baidu.com/apiworks/servicedetail/688.html 这个借口时碰到了一个问题,每次只有服务器重启第一次访问接口的时候能拿到数据,请问这是为什么?该如何解决? 解决方案 原来是自己初始化字符串的时候出错了

HttpRuntime.Cache在一般处理程序中设置了值,当下一次请求时,里面又重置,不知道怎么回事

问题描述 HttpRuntime.Cache在一般处理程序中设置了值,当下一次请求时,里面又重置.然后我又再Global里添加静态变量,在一般处理程序中对其进行更改,在下一次请求也重置了....iis没有重启--代码如下:publicclassGlobal:System.Web.HttpApplication{publicstaticintlist=0;}这是一般处理程序中的:Global.list++;HttpRuntime.Cache.Insert(("m"+mid),m,null