Me basé un poco en la respuesta de @ DavidLin para simplificarla, eliminando cualquier dependencia de jQuery en la directiva. Puedo confirmar que esto funciona ya que lo uso en una aplicación de producción.
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;
});
}
};
}
Utilizo una ng-show
llamada a jQuery en lugar de una para ocultar / mostrar el <div>
.
Aquí está el <div>
que coloqué justo debajo de la <body>
etiqueta de apertura :
<div ajax-loading-overlay class="loading-overlay" ng-show="loadingOverlay">
<img src="Resources/Images/LoadingAnimation.gif" />
</div>
Y aquí está el CSS que proporciona la superposición para bloquear la interfaz de usuario mientras se realiza una llamada $ 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;
}
El crédito de CSS es para @Steve Seeger, su publicación: https://stackoverflow.com/a/35470281/335545