Ich habe ein wenig auf der Antwort von @ DavidLin aufgebaut, um sie zu vereinfachen - und die Abhängigkeit von jQuery in der Direktive zu beseitigen . Ich kann bestätigen, dass dies funktioniert, wenn ich es in einer Produktionsanwendung verwende
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;
});
}
};
}
Ich benutze einen ng-show
statt eines jQuery-Aufrufs, um das auszublenden / anzuzeigen <div>
.
Hier ist das, <div>
was ich direkt unter dem Eröffnungs- <body>
Tag platziert habe:
<div ajax-loading-overlay class="loading-overlay" ng-show="loadingOverlay">
<img src="Resources/Images/LoadingAnimation.gif" />
</div>
Und hier ist das CSS, das das Overlay zum Blockieren der Benutzeroberfläche bereitstellt, während ein $ http-Aufruf ausgeführt wird:
.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;
}
Das CSS-Guthaben geht an @Steve Seeger - seinen Beitrag: https://stackoverflow.com/a/35470281/335545