¿Cómo muestro una pantalla de carga cuando cambio una ruta en Angular 2?
html
css
angular
angular2-routing
Lucas
fuente
fuente
Respuestas:
El enrutador angular actual proporciona eventos de navegación. Puede suscribirse a estos y hacer cambios en la interfaz de usuario en consecuencia. Recuerde contar en otros eventos como
NavigationCancel
yNavigationError
para detener su ruleta en caso de que falle la transición del enrutador.app.component.ts : su componente raíz
app.component.html : su vista raíz
Respuesta de rendimiento mejorado : si le importa el rendimiento, existe un método mejor, es un poco más tedioso implementarlo, pero la mejora del rendimiento valdrá la pena el trabajo extra. En lugar de usar
*ngIf
para mostrar condicionalmente la ruleta, podríamos aprovechar Angular'sNgZone
yRenderer
encender / apagar la ruleta que evitará la detección de cambios de Angular cuando cambiemos el estado de la ruleta. Encontré esto para hacer que la animación sea más suave en comparación con el uso*ngIf
o unaasync
tubería.Esto es similar a mi respuesta anterior con algunos ajustes:
app.component.ts : su componente raíz
app.component.html : su vista raíz
fuente
router navigation
yit triggering the spinner
y luego no ser capaz de detenerlo.navigationInterceptor
Parece una solución, pero no estoy seguro de si hay algo más esperando para romperse. Si se mezcla con elasync requests
, volverá a presentar el problema, creo.display
cualquieranone
oinline
.'md-spinner' is not a known element:
. Soy bastante nuevo en Angular. ¿Podría decirme cuál podría ser el error?ACTUALIZACIÓN: 3 Ahora que he actualizado al nuevo enrutador, el enfoque de @borislemke no funcionará si usa
CanDeactivate
guardia. Estoy degradando a mi antiguo método,ie:
esta respuestaACTUALIZACIÓN2 : Los eventos del enrutador en el nuevo enrutador parecen prometedores y la respuesta de @borislemke parece cubrir el aspecto principal de la implementación del spinner, no lo he probado pero lo recomiendo.
ACTUALIZACIÓN1: Escribí esta respuesta en la era de
Old-Router
, cuando solía haber solo un eventoroute-changed
notificado a través derouter.subscribe()
. También sentí una sobrecarga del siguiente enfoque e intenté hacerlo solorouter.subscribe()
, y resultó contraproducente porque no había forma de detectarlocanceled navigation
. Así que tuve que volver a un enfoque largo (doble trabajo).Si conoce bien Angular2, esto es lo que necesitará.
Boot.ts
Componente raíz: (MyApp)
Spinner-Component (se suscribirá a Spinner-service para cambiar el valor de active en consecuencia)
Spinner-Service (arranque este servicio)
Defina un observable para ser suscrito por el componente spinner para cambiar el estado del cambio, y funcione para conocer y configurar el spinner activo / inactivo.
Todos los componentes de otras rutas
(muestra):
fuente
spinner-service
ahora, solo necesita otras partes para que funcione. Y recuerda que es paraangular2-rc-1
¿Por qué no simplemente usando CSS simple:
Y en tus estilos:
O incluso podemos hacer esto para la primera respuesta:
Y luego simplemente
El truco aquí es que las nuevas rutas y componentes siempre aparecerán después de la salida del enrutador , por lo que con un simple selector css podemos mostrar y ocultar la carga.
fuente
Si solo necesita una lógica especial para la primera ruta, puede hacer lo siguiente:
AppComponent
Tenía la necesidad de que esto ocultara el pie de página, que aparecía en la parte superior de la página. Además, si solo desea un cargador para la primera página, puede usarlo.
fuente
También podría usar esta solución existente . La demo está aquí . Parece la barra de carga de youtube. Lo encontré y lo agregué a mi propio proyecto.
fuente