Oparłem się trochę na odpowiedzi @ DavidLin, aby ją uprościć - usuwając w dyrektywie wszelkie zależności od jQuery . Mogę potwierdzić, że to działa, ponieważ używam go w aplikacji produkcyjnej
function AjaxLoadingOverlay($http) {
return {
restrict: 'A',
link: function ($scope, $element, $attributes) {
$scope.loadingOverlay = false;
$scope.isLoading = function () {
return $http.pendingRequests.length > 0;
};
$scope.$watch($scope.isLoading, function (isLoading) {
$scope.loadingOverlay = isLoading;
});
}
};
}
Używam ng-show
zamiast wywołania jQuery, aby ukryć / pokazać plik <div>
.
Oto, <div>
który umieściłem tuż pod otwierającym <body>
tagiem:
<div ajax-loading-overlay class="loading-overlay" ng-show="loadingOverlay">
<img src="Resources/Images/LoadingAnimation.gif" />
</div>
A oto CSS, który zapewnia nakładkę do blokowania interfejsu użytkownika podczas wywołania $ http:
.loading-overlay {
position: fixed;
z-index: 999;
height: 2em;
width: 2em;
overflow: show;
margin: auto;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.loading-overlay:before {
content: '';
display: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.3);
}
/* :not(:required) hides these rules from IE9 and below */
.loading-overlay:not(:required) {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
Kredyt CSS trafia do @Steve Seeger's - jego post: https://stackoverflow.com/a/35470281/335545