Usando Angularjs, necesito mostrar una pantalla de carga (una ruleta simple) hasta que se complete la solicitud ajax. Sugiera cualquier idea con un fragmento de código.
angularjs
angularjs-directive
Badhrinath Canessane
fuente
fuente
$httpProvider.interceptors
ya que puede manejar cuándo comienza la solicitud ajax y cuándo termina. Es por eso$watch
que ya no es necesario para detectar cuándo comienza y finaliza la llamada ajax.Respuestas:
En lugar de configurar una variable de alcance para indicar el estado de carga de datos, es mejor tener una directiva que haga todo por usted:
Con esta directiva, todo lo que necesita hacer es darle a cualquier elemento de animación de carga un atributo de 'carga':
Puede tener varios marcadores de carga en la página. dónde y cómo distribuir esos elementos giratorios depende de usted y la directiva simplemente lo activará / desactivará automáticamente.
fuente
He aquí un ejemplo. Utiliza el método simple ng-show con un bool.
HTML
ANGULARJS
Por supuesto, puede mover el código html del cuadro de carga a una directiva y luego usar $ watch en $ scope.loading. En ese caso:
HTML :
DIRECTIVA ANGULARJS :
PLUNK : http://plnkr.co/edit/AI1z21?p=preview
fuente
ui-router
, no sé por quéloading=true
no se configuraUtilizo ngProgress para esto.
Agregue 'ngProgress' a sus dependencias una vez que haya incluido los archivos script / css en su HTML. Una vez que lo hagas, puedes configurar algo como esto, que se activará cuando se detecte un cambio de ruta.
Para las solicitudes AJAX, puede hacer algo como esto:
Solo recuerde agregar 'ngProgress' a las dependencias de los controladores antes de hacerlo. Y si está haciendo varias solicitudes AJAX, use una variable incremental en el alcance de la aplicación principal para realizar un seguimiento de cuándo han finalizado sus solicitudes AJAX antes de llamar a 'ngProgress.complete ();'.
fuente
el uso de SavedRequests no es correcto porque, como se menciona en la documentación de Angular, esta propiedad está destinada principalmente a ser utilizada con fines de depuración.
Lo que recomiendo es usar un interceptor para saber si hay alguna llamada Async activa.
y luego verifique si activeCalls es cero o no en la directiva a través de un $ watch.
fuente
La mejor manera de hacer esto es usar interceptores de respuesta junto con una directiva personalizada . Y el proceso se puede mejorar aún más usando el mecanismo pub / sub usando los métodos $ rootScope. $ Broadcast & $ rootScope. $ On .
Como todo el proceso está documentado en un artículo de blog bien escrito , no voy a repetirlo aquí de nuevo. Consulte ese artículo para obtener la implementación que necesita.
fuente
En referencia a esta respuesta
https://stackoverflow.com/a/17144634/4146239
Para mí es la mejor solución, pero hay una forma de evitar el uso de jQuery.
Necesita reemplazar $ (elemento) .show (); y (elemento) .show (); con $ scope.loadingStatus = 'true'; y $ scope.loadingStatus = 'false';
Entonces, debe usar esta variable para establecer el atributo ng-show del elemento.
fuente
Implementación de mecanografiado y angular
directiva
Alcance
Modelo
fuente
Si está utilizando Restangular (que es increíble), puede crear una animación durante las llamadas a la API. Aquí está mi solución. Agregue un interceptor de respuesta y un interceptor de solicitud que envíe una transmisión de alcance radicular. Luego crea una directiva para escuchar esa respuesta y solicitud:
Aquí está la directiva:
fuente
Incluya esto en su "app.config":
Y agrega este código:
fuente
Utilice angular-ocupado :
Agregue cgBusy a su aplicación / módulo:
Agregue su promesa a
scope
:En su plantilla html:
fuente
Además, hay una buena demostración que muestra cómo puede usar la
Angularjs
animación en su proyecto.El enlace está aquí (vea la esquina superior izquierda) .
Es una fuente abierta. Aquí está el enlace para descargar
Y aquí está el enlace para el tutorial ;
Mi punto es, continúe y descargue los archivos fuente y luego vea cómo han implementado el spinner. Podrían haber utilizado un enfoque un poco mejor. Entonces, mira este proyecto.
fuente
Aquí, un 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 en el estado de carga, pero allí es posible mostrar / ocultar cualquier contenido del cargador, o agregar, eliminar algunas clases css que muestran el cargador.El 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.
Interceptor está utilizando jqLite angular compilado https://docs.angularjs.org/api/ng/function/angular.element, por lo que no se necesita Jquery.
fuente
Cree una directiva con los atributos de espectáculo y tamaño (también puede agregar más)
y en html usar como
En la variable show , pase verdadero cuando se esté ejecutando cualquier promesa y hágalo falso cuando se complete la solicitud. Demostración activa: demostración de ejemplo de la directiva Angular Loader en JsFiddle
fuente
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.
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 :Y aquí está el CSS que proporciona la superposición para bloquear la interfaz de usuario mientras se realiza una llamada $ http:
El crédito de CSS es para @Steve Seeger, su publicación: https://stackoverflow.com/a/35470281/335545
fuente
Puede agregar una condición y luego cambiarla a través del raicescopio. Antes de su solicitud ajax, simplemente llame a $ rootScope. $ Emit ('stopLoader');
Definitivamente, esta no es la mejor solución, pero aún funcionaría.
fuente