Estoy buscando detectar un cambio de ruta en mi AppComponent
.
Posteriormente, comprobaré el token de usuario global para ver si ha iniciado sesión. Luego, puedo redirigir al usuario si no ha iniciado sesión.
En Angular 2 puede subscribe
(evento Rx) a una instancia de enrutador. Entonces puedes hacer cosas como
class MyClass {
constructor(private router: Router) {
router.subscribe((val) => /*whatever*/)
}
}
Editar (desde rc.1)
class MyClass {
constructor(private router: Router) {
router.changes.subscribe((val) => /*whatever*/)
}
}
Edición 2 (desde 2.0.0)
ver también: Router.events doc
class MyClass {
constructor(private router: Router) {
router.events.subscribe((val) => {
// see also
console.log(val instanceof NavigationEnd)
});
}
}
event._root.children[0].value._routeConfig.data
, espero que haya una mejor manerafilter
operador RxJS .router.events.pipe(filter(e => e instanceof NavigationEnd).subscribe((e) => { ... }
RxJS 6
Gracias a Peilonrayz (ver comentarios a continuación)
nuevo enrutador> = RC.3
También puede filtrar por evento dado:
Usar el
pairwise
operador para obtener el evento anterior y actual también es una buena idea. https://github.com/angular/angular/issues/11268#issuecomment-244601977fuente
Argument of type '(event: Event) => void' is not assignable to parameter of type
Argument of type '(event: Event) => void' is not assignable to parameter of type
error se debe a que en el fragmento de filtro se está suscribiendo a un objeto de tipo Evento en lugar de NavigationEvent.Para Angular 7, alguien debería escribir como:
this.router.events.subscribe((event: Event) => {})
Un ejemplo detallado puede ser el siguiente:
fuente
Angular 7 , si quieres
subscribe
arouter
fuente
Angular 4.xy superior:
Esto se puede lograr usando la propiedad url de la clase ActivatedRoute como se muestra a continuación,
Nota: que necesita importar e inyectar el proveedor del
angular/router
paquetey
fuente
Router 3.0.0-beta.2 debería ser
fuente
En angular 6 y RxJS6:
fuente
import {Router, NavigationEnd} from "@angular/router"
Las respuestas aquí son correctas
router-deprecated
. Para la última versión derouter
:o
Para ver la diferencia entre los dos, consulte esta pregunta SO .
Editar
Para lo último debes hacer:
fuente
router
ha actualizado nuevamente (aún no he actualizado mi respuesta), por lo que no estoy seguro de cómo es para la última. Por lorouter
que escribí, no pudiste. @aknEn Angular 8 deberías hacer como
this.router.events.subscribe((event: Event) => {})
Ejemplo:
fuente
En el componente, es posible que desee probar esto:
fuente
fuente
La ubicación funciona ...
fuente
arriba, la mayoría de las soluciones son correctas, pero estoy enfrentando un problema que emite varias veces el evento 'Navegación emitida'. Cuando cambié alguna ruta, este evento se activa. Entonces escuchar es la solución completa para Angular 6.
fuente
La respuesta de @Ludohen es excelente, pero en caso de que no quiera usarla,
instanceof
use lo siguientede esta manera, puede verificar el nombre del evento actual como una cadena y, si ocurrió el evento, puede hacer lo que planeó que hiciera su función.
fuente
Event
tipo está causando un error en Atom por eso no lo uséinstanceOf
para que su ejemplo también funcione en el código de producción.if(event instanceOf NavigationStart) {
if(event instanceof NavigationStart)
Estoy trabajando con la aplicación angular5 y estoy enfrentando el mismo problema. Cuando reviso la documentación angular, proporcionan la mejor solución para manejar los eventos del enrutador. Verifique la siguiente documentación.
Eventos de enrutador en eventos de ruta angular en angular5
Pero específicamente para el caso en cuestión, necesitamos el evento NavigationEnd
Evento final de navegación angular
Como usar esto ?
¿Cuándo usar esto?
En mi caso, mi aplicación comparte un tablero común para todos los usuarios, como usuarios, administradores, pero necesito mostrar y ocultar algunas opciones de la barra de navegación según los tipos de usuarios.
Es por eso que cada vez que cambia la URL necesito llamar al método de servicio que devuelve la información de usuario registrada según la respuesta, iré para más operaciones.
fuente
El siguiente TIPO de trabajos y puede hacer el truco para usted.
Desafortunadamente, esto redirige más tarde en el proceso de enrutamiento de lo que me gustaría. los
onActivate()
del componente de destino original se llama antes de la redirección.Hay un
@CanActivate
decorador que puede usar en el componente de destino, pero este es a) no centralizado yb) no se beneficia de los servicios inyectados.Sería genial si alguien puede sugerir una mejor manera de autorizar centralmente una ruta antes de que se comprometa. Estoy seguro de que debe haber una mejor manera.
Este es mi código actual (¿Cómo lo cambiaría para escuchar el cambio de ruta?):
fuente
Lo hago así desde RC 5
fuente
Simplemente haga cambios en AppRoutingModule como
fuente
Angular 8. Compruebe si la ruta actual es la ruta base .
fuente
Escribiría algo como esto:
fuente
respuesta simple para Angular 8. *
fuente