我在SO上找到了一个关于http / resource调用的加载微调器的例子:
正如您所看到的,实现有效(使用AngularJS 1.0.5)。但是,如果您将源更改为AngularJS 1.1.5。这个例子不再适用了。
我了解到$httpProvider.responseInterceptors
在1.1.5中已弃用。
相反,应该使用$httpProvider.interceptors
不幸的是,只是在Plunker中替换上面的字符串并没有解决问题。有没有人在AngularJS 1.1.5中使用HttpInterceptor做过这样的加载微调器?
感谢您的帮助!
迈克尔
答案 0 :(得分:110)
感谢Steve的暗示,我能够实现加载器:
<强>拦截器:强>
.factory('httpInterceptor', function ($q, $rootScope, $log) {
var numLoadings = 0;
return {
request: function (config) {
numLoadings++;
// Show loader
$rootScope.$broadcast("loader_show");
return config || $q.when(config)
},
response: function (response) {
if ((--numLoadings) === 0) {
// Hide loader
$rootScope.$broadcast("loader_hide");
}
return response || $q.when(response);
},
responseError: function (response) {
if (!(--numLoadings)) {
// Hide loader
$rootScope.$broadcast("loader_hide");
}
return $q.reject(response);
}
};
})
.config(function ($httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
});
<强>指令:强>
.directive("loader", function ($rootScope) {
return function ($scope, element, attrs) {
$scope.$on("loader_show", function () {
return element.show();
});
return $scope.$on("loader_hide", function () {
return element.hide();
});
};
}
)
<强> CSS:强>
#loaderDiv {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1100;
background-color: white;
opacity: .6;
}
.ajax-loader {
position: absolute;
left: 50%;
top: 50%;
margin-left: -32px; /* -1 * image width / 2 */
margin-top: -32px; /* -1 * image height / 2 */
display: block;
}
<强> HTML:强>
<div id="loaderDiv" loader>
<img src="src/assets/img/ajax_loader.gif" class="ajax-loader"/>
</div>
答案 1 :(得分:18)
“responseInterceptors”已弃用。 “拦截器”取代了预览版中的许多增强功能。我不记得哪个版本。关于此的文档很少,因此您最好检查源代码。
变化的要点如下:
$httpProvider.interceptors.push(function($q, $rootScope) {
return {
'request': function(config) {
// intercepts the request
},
'response': function(response) {
// intercepts the response. you can examine things like status codes
},
'responseError': function(response) {
// intercepts the response when the response was an error
}
}
});
在角度源中,您可以在$ HttpProvider函数中找到“*#Interceptors”下的文档。有一个示例用法非常类似于我上面发布的内容。
答案 2 :(得分:2)
提供/接受的解决方案很好如果您想在解决方案中包含JQuery ,AngularJS团队建议不要继续使用。 Angular的JQLite不支持element.show/.hide .... 因此,在非jquery会话中运行以下重构是必需的:
更改HTML元素以添加“隐藏”类
<div id="loaderDiv" loader class="hidden">
<img src="Content/images/yourgif.gif" class="ajax-loader" />
</div>
将隐藏的类添加到您的css:
.hidden{display:none !important}
然后调整指令:
(function() {
'use strict';
angular
.module('your_app')
.directive('yourSpinner', yourSpinner);
yourSpinner.$inject = ['$rootScope'];
function yourSpinner($rootScope) {
return function($scope, element, attrs) {
$scope.$on("loader_show", function () {
if (element.hasClass("hidden")) {
element.removeClass("hidden")
}
});
return $scope.$on("loader_hide", function () {
if(!element.hasClass("hidden")){
element.addClass("hidden")
}
});
}
}
})();
工厂现状很好。