Estoy usando el $http
servicio de AngularJS para hacer una solicitud de Ajax.
¿Cómo se puede mostrar un GIF giratorio (u otro tipo de indicador de ocupado) mientras se ejecuta la solicitud de Ajax?
No veo nada como ajaxstartevent
en la documentación de AngularJS.
angularjs
ajax
busyindicator
Ajay Beniwal
fuente
fuente
Respuestas:
Aquí están los encantamientos
actuales deAngularJS:Aquí está el resto (HTML / CSS) ... usando
para alternarlo. NOTA: lo anterior se usa en el módulo angular al comienzo de la publicación
fuente
angular.element('#mydiv').show()
lugar de$('#mydiv').show()
ng-class
directiva en lugar de usar JQuery para mostrar y ocultar elementos?Esto realmente depende de su caso de uso específico, pero una forma simple seguiría un patrón como este:
Y luego reacciona a él en tu plantilla:
fuente
loading
como un número entero$scope.loading = 0;
, cuando comienza una solicitud$scope.loading++;
, y cuando termina, lo hace$scope.loading--;
. Y no hay nada que cambiar en la plantilla. Por lo tanto, la rueda giratoria se muestra cuando hay al menos una solicitud en progreso y está oculta el resto del tiempo$scope.loading = false
tanto la devolución de llamada correcta como la incorrecta, es ponerla en el.finally()
. Se vería así:mySvc.get().then(success, fail).finally(function() { $scope.loading = false; });
Aquí hay una versión usando a
directive
yng-hide
.Esto mostrará el cargador durante todas las llamadas a través del
$http
servicio de angular .En la plantilla:
<div class="loader" data-loading></div>
directiva:
Al usar la
ng-hide
clase en el elemento, puede evitar jquery.Personalizar: agregar un
interceptor
Si crea un interceptor de carga, puede mostrar / ocultar el cargador en función de una condición.
directiva:
interceptador:
spinner
cuandoresponse.background === true;
request
y / oresponse
establecer$rootScope.$broadcast("loader_show");
o$rootScope.$broadcast("loader_hide");
Más información sobre cómo escribir un interceptor
fuente
$http
de cualquier servicio.Si está utilizando ngResource, el atributo $ resuelto de un objeto es útil para los cargadores:
Para un recurso de la siguiente manera:
Puede vincular un cargador al atributo $ resuelto del objeto de recurso:
fuente
https://github.com/wongatech/angular-http-loader es un buen proyecto para esto.
Ejemplo aquí http://wongatech.github.io/angular-http-loader/
El siguiente código muestra un ejemplo de plantilla / loader.tpl.html cuando una solicitud está ocurriendo.
fuente
Acabo de descubrir la
angular-busy
directiva que muestra un pequeño cargador dependiendo de alguna llamada asíncrona.Por ejemplo, si tiene que hacer una
GET
referencia a la promesa en su$scope
,y llámalo así:
Aquí está el GitHub.
También puede instalarlo usando
bower
(no olvide actualizar las dependencias de su proyecto):fuente
Si está envolviendo sus llamadas de API dentro de un servicio / fábrica, puede rastrear el contador de carga allí (por respuesta y excelente sugerencia simultánea de @JMaylin), y hacer referencia al contador de carga a través de una directiva. O cualquier combinación de los mismos.
Envoltorio API
DIRECTIVA SPINNER
USO
fuente
Para cargas de página y modales, la forma más fácil es usar la
ng-show
directiva y usar una de las variables de datos de alcance. Algo como:Aquí, mientras
someObject
no está definido, se mostrará la rueda giratoria. Una vez que el servicio regresa con datos ysomeObject
se completa, el control giratorio volverá a su estado oculto.fuente
Esta es la forma más fácil de agregar una ruleta, supongo:
Puede usar ng-show con la etiqueta div de cualquiera de estos hermosos hilanderos http://tobiasahlin.com/spinkit/ {{Esta no es mi página}}
y luego puedes usar este tipo de lógica
fuente
Agregue este CSS:
Y solo en tu complemento angular:
$ rootScope.loading = false; $ rootScope.loading = true; -> cuando termina $ http.get.
fuente
Compartí mi versión de la gran respuesta de @bulltorious, actualizada para las nuevas construcciones angulares (usé la versión 1.5.8 con este código), y también incorporé la idea de @ JMaylin de usar un contador para ser robusto a múltiples solicitudes simultáneas, y el opción para omitir la visualización de la animación para solicitudes que toman menos de un número mínimo de milisegundos:
fuente
Puede usar el interceptor angular para gestionar llamadas de solicitud http
https://stackoverflow.com/a/49632155/4976786
fuente
Manera simple sin interceptores o jQuery
Esta es una manera simple de mostrar una ruleta que no requiere una biblioteca de terceros, interceptores o jQuery.
En el controlador, configure y restablezca una bandera.
En el HTML, use la bandera:
El
vm.starting
indicador se establecetrue
cuando se inicia el XHR y se borra cuando se completa el XHR.fuente
Esto funciona bien para mi:
HTML:
Angular:
Mientras la promesa devuelta por $ http está pendiente, ng-show la evaluará como "verdadera". Esto se actualiza automáticamente una vez que se resuelve la promesa ... que es exactamente lo que queremos.
fuente
Se utiliza después del interceptor para mostrar la barra de carga en la solicitud http
fuente
fuente
crear directiva con este código:
fuente
Otra solución para mostrar la carga entre diferentes cambios de URL es:
Y luego en el marcado simplemente alterna la rueda giratoria con
ng-show="loading"
.Si desea mostrarlo en solicitudes ajax, simplemente agregue
$scope.loading++
cuando comience la solicitud y cuando termine de agregar$scope.loading--
.fuente
Puedes probar algo como esto también:
Crear directiva:
Luego agrega algo como esto a mainCtrl
Y HTML puede tener este aspecto:
fuente
La siguiente forma tomará nota de todas las solicitudes y se ocultará solo una vez que se hayan realizado todas las solicitudes:
fuente
Dado que la funcionalidad de position: fixed cambió recientemente, tuve dificultades para mostrar el cargador de gif sobre todos los elementos, así que tuve que usar jQuery incorporado de angular .
HTML
Css
Controlador
Espero que esto ayude :)
fuente
Todas las respuestas son complicadas, o necesitan establecer algunas variables en cada solicitud, lo cual es una práctica muy incorrecta si conocemos el concepto DRY. Aquí, simple ejemplo de interceptor, configuro el mouse en espera cuando se inicia ajax y lo configuro en automático cuando finaliza ajax.
El código debe agregarse en la configuración de la aplicación
app.config
. Mostré cómo cambiar el mouse al cargar el estado, pero allí es posible mostrar / ocultar cualquier contenido del cargador, o agregar, eliminar algunas clases de CSS que muestran el cargador.Interceptor se ejecutará en cada llamada ajax, por lo que no es necesario crear variables booleanas especiales ($ scope.loading = true / false, etc.) en cada llamada http.
fuente
Aquí está mi implementación, tan simple como un ng-show y un contador de solicitudes.
Utiliza un nuevo servicio para todas las solicitudes a $ http:
Y luego puede usar su base de cargador en la cantidad de llamadas actuales:
fuente
si desea mostrar el cargador para cada llamada de solicitud http, puede usar el interceptor angular para administrar las llamadas de solicitud http,
aquí hay un código de muestra
fuente
Solo usa ng-show y un booleano
No es necesario utilizar una directiva, no es necesario complicarse.
Aquí está el código para poner al lado del botón de envío o donde quiera que esté la ruleta:
Y luego en tu controlador:
fuente
Aquí está mi solución, que creo que es mucho más fácil que la otra publicada aquí. Sin embargo, no estoy seguro de cuán "bonito" es, pero resolvió todos mis problemas
Tengo un estilo CSS llamado "cargando"
El html para el div de carga puede ser lo que sea, pero utilicé algunos iconos FontAwesome y el método de giro allí:
En los elementos que desea ocultar, simplemente escriba esto:
y en la función simplemente configuré esto en carga.
Estoy usando SignalR, así que en la función hubProxy.client.allLocks (cuando termina de pasar por los bloqueos) solo pongo
Esto también oculta el {{someField}} cuando la página se está cargando, ya que estoy configurando la clase de carga en carga y AngularJS la elimina después.
fuente