En Angular, el enrutamiento以模块为单位
y cada módulo puede tener su propio enrutamiento. [Recomendación de tutorial relacionado: "tutorial angular"]
1. Cree componentes de página, componentes de diseño y componentes de navegación para uso de enrutamiento.
Cree el componente de la página de inicio ng gc pages/home
Cree el componente de la página Acerca de nosotros ng gc pages/about
Cree el componente de diseño ng gc pages/layout
Cree el componente de navegación ng gc pages/navigation
2. Cree reglas de enrutamiento
// app.module. ts importar {Rutas} desde "@angular/router" rutas constantes: Rutas = [ { ruta: "casa", componente: InicioComponente }, { ruta: "acerca de", componente: Acerca del componente } ]
3. Introduzca el módulo de enrutamiento e inicie
// app.module.ts importar {RouterModule, Rutas} desde "@angular/router" @NgModule({ importaciones: [RouterModule.forRoot(rutas, {useHash: true})], }) export class AppModule {}
4. Agregue路由插座
<!-- El socket de enrutamiento, es decir, el componente de enrutamiento que coincide con el componente de marcador de posición se mostrará aquí --> <router-outlet></router-outlet>5. Defina el enlace
<a routerLink="/home">Página de inicio</a>
en el componente de navegación.
<a routerLink="/about">Acerca de nosotros</a>
1. Redirigir
rutas constantes: Rutas = [ { ruta: "casa", componente: InicioComponente }, { ruta: "acerca de", componente: Acerca del componente }, { camino: "", // Redirigir redirigir a: "casa", // Coincidencia exacta pathMatch: "completo" } ]
2.
Rutas constantes de 404 páginas: Rutas = [ { ruta: "casa", componente: InicioComponente }, { ruta: "acerca de", componente: Acerca del componente }, { camino: "**", componente: NotFoundComponent } ]
1. Parámetros de consulta
<a routerLink="/about" [queryParams]="{ name: 'kitty' }">Acerca de nosotros</a>
importar { ActivatedRoute } desde "@angular/router" clase de exportación AboutComponent implementa OnInit { constructor (ruta privada: ActivatedRoute) {} ngOnInit(): nulo { this.route.queryParamMap.subscribe(consulta => { consulta.get("nombre") }) } }
2.
Rutas constantes del parámetro dinámico: Rutas = [ { ruta: "casa", componente: InicioComponente }, { ruta: "acerca de/:nombre", componente: Acerca del componente } ]
<a [routerLink]="['/about', 'zhangsan']">Acerca de nosotros</a>
importar { ActivatedRoute } desde "@angular/router" clase de exportación AboutComponent implementa OnInit { constructor (ruta privada: ActivatedRoute) {} ngOnInit(): nulo { this.route.paramMap.subscribe(params => { params.get("nombre") }) } }
El anidamiento de rutas se refiere a cómo定义子级路由
.
rutas constantes: Rutas = [ { ruta: "acerca de", componente: Acerca del componente, niños: [ { ruta: "presentar", componente: IntroducirComponente }, { ruta: "historia", componente: Componente Histórico } ] } ]
<!-- about.component.html --> <diseño de aplicación> <p>¡Sobre obras!</p> <a routerLink="/about/introduce">Perfil de empresa</a> <a routerLink="/about/history">Historial de desarrollo</a> <div> <salida-enrutador></salida-enrutador> </div> </app-layout>
Nombre el socket
Exponga los componentes de enrutamiento secundarios en diferentes salidas de enrutamiento.
{ ruta: "acerca de", componente: Acerca del componente, niños: [ { ruta: "presentar", componente: IntroducirComponente, salida: "izquierda" }, { ruta: "historia", componente: componente histórico, salida: "derecha" } ] }
<!-- acerca de.component.html --> <diseño de aplicación> <p>¡Sobre obras!</p> <router-outlet nombre="izquierda"></router-outlet> <router-outlet nombre="derecho"></router-outlet> </app-layout>
<a [enlaceenrutador]="[ '/acerca de', { puntos de venta: { izquierda: ['presentar'], derecha: ['historia'] } } ]" >Quienes somos</a>
<!-- aplicación.componente.html --> <button (click)="jump()">Ir al historial de desarrollo</button>
// app.component.ts importar {enrutador} desde "@angular/router" exportar clase HomeComponent { constructor(enrutador privado: enrutador) {} saltar() { this.router.navigate(["/acerca de/historia"], { parámetros de consulta: { nombre: "gatito" } }) } }
Resuma la configuración de enrutamiento en el módulo raíz en un módulo de enrutamiento separado, llamado根路由模块
, y luego introduzca el módulo de enrutamiento raíz en el módulo raíz.
importar {NgModule} desde "@angular/core" importar {HomeComponent} desde "./pages/home/home.component" importar {NotFoundComponent} desde "./pages/not-found/not-found.component" rutas constantes: Rutas = [ { camino: "", componente: InicioComponente }, { camino: "**", componente: NotFoundComponent } ] @NgModule({ declaraciones: [], importaciones: [RouterModule.forRoot(rutas, {useHash: true})], // Exporta el módulo de función de enrutamiento angular, porque el componente de socket de enrutamiento proporcionado en el módulo RouterModule se usa en el componente raíz del módulo raíz exportado: [RouterModule] }) exportar clase AppRoutingModule {}
importar {BrowserModule} desde "@angular/platform-browser" importar {NgModule} desde "@angular/core" importar {AppComponent} desde "./app.component" importar {AppRoutingModule} desde "./app-routing.module" importar {HomeComponent} desde "./pages/home/home.component" importar {NotFoundComponent} desde "./pages/not-found/not-found.component" @NgModule({ declaraciones: [AppComponent, HomeComponent, NotFoundComponent], importaciones: [BrowserModule, AppRoutingModule], proveedores: [], arranque: [Componente de aplicación] }) clase de exportación AppModule {}
La carga diferida de rutas se basa en模块
.
1. Cree el módulo de usuario ng gm user --routing=true
y cree el módulo de enrutamiento de este módulo juntos
2. Cree el componente de página de inicio de sesión ng gc user/pages/login
3. Cree el componente de página de registro ng gc user/pages/register
4. Reglas de enrutamiento de configuración para módulos de usuario
import { NgModule } desde "@angular/core" importar {Rutas, RouterModule} desde "@angular/router" importar {LoginComponent} desde "./pages/login/login.component" importar { RegisterComponent } desde "./pages/register/register.component" rutas constantes: Rutas = [ { ruta: "iniciar sesión", componente: Componente de inicio de sesión }, { ruta: "registro", componente: RegistrarComponente } ] @NgModule({ importaciones: [RouterModule.forChild(rutas)], exportaciones: [Módulo de enrutador] }) export class UserRoutingModule {}
5. Asociar el módulo de enrutamiento de usuario al módulo de enrutamiento principal
// app-routing.module.ts rutas constantes: Rutas = [ { ruta: "usuario", loadChildren: () => importar("./usuario/usuario.module").luego(m => m.UserModule) } ]6. Agregue el enlace de acceso
<a routerLink="/user/login">Iniciar sesión</a>
en el componente de navegación.
<a routerLink="/user/register">Registrarse</a>
El guardia de ruta le indica a la ruta si está permitida la navegación hacia la ruta solicitada.
Los métodos de protección de ruta pueden devolver boolean
, Observable <boolean>
o Promise <boolean>
, que se resuelven en un valor booleano en algún momento en el futuro.
1. CanActivate
comprueba是否可以访问某一个路由
.
CanActivate为接口
y la clase de protección de ruta debe implementar esta interfaz. Esta interfaz estipula que la clase debe tener un método canActivate, que determina si se permite el acceso a la ruta de destino.
Una ruta puede aplicar多个守卫
. Si se permiten todos los métodos de protección, se permite el acceso a la ruta. Si no se permite un método de protección, no se permite el acceso a la ruta.
Crear guardias de ruta: ng g guard guards/auth
import { Injectable } from "@angular/core" importar {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router} desde "@angular/router" importar {Observable} desde "rxjs" @Inyectable({ proporcionado en: "raíz" }) la clase de exportación AuthGuard implementa CanActivate { constructor(enrutador privado: enrutador) {} canActivate(): booleano | Árbol de URL { // Se utiliza para implementar el retorno de salto this.router.createUrlTree(["/user/login"]) // Deshabilitar el acceso a la ruta de destino devuelve falso //Permitir el acceso a la ruta de destino devuelve verdadero } }
{ ruta: "acerca de", componente: Acerca del componente, puedeActivar: [AuthGuard] }
2. CanActivateChild
comprueba si el usuario puede acceder a una determinada subruta.
Crear una ruta guardia: ng g guard guards/admin
Nota: Para seleccionar CanActivateChild, mueva la flecha a esta opción y toque el espacio para confirmar la selección.
importar {Inyectable} desde "@angular/core" importar {CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} desde "@angular/router" importar {Observable} desde "rxjs" @Inyectable({ proporcionado en: "raíz" }) clase de exportación AdminGuard implementa CanActivateChild { canActivateChild(): booleano | Árbol de URL { devolver verdadero } }
{ ruta: "acerca de", componente: Acerca del componente, canActivateChild: [AdminGuard], niños: [ { ruta: "presentar", componente: IntroducirComponente } ] }
3. CanDeactivate
comprueba si el usuario puede salir de la ruta.
Por ejemplo, si el contenido ingresado por el usuario en el formulario no se guarda y el usuario quiere abandonar la ruta, se puede llamar al guardia para avisarle.
importar {Inyectable} desde "@angular/core" importar { puede desactivar, Instantánea de ruta activada, Instantánea del estado del enrutador, Árbol de URL } de "@angular/router" importar {Observable} desde "rxjs" interfaz de exportación CanComponentLeave { canLeave: () => booleano } @Inyectable({ proporcionado en: "raíz" }) la clase de exportación UnsaveGuard implementa CanDeactivate<CanComponentLeave> { canDeactivate(componente: CanComponentLeave): booleano { si (componente.canLeave()) { devolver verdadero } devolver falso } }
{ camino: "", componente: componente de inicio, canDeactivate: [UnsaveGuard] }
importar {CanComponentLeave} desde "src/app/guards/unsave.guard" clase de exportación HomeComponent implementa CanComponentLeave { miForma: GrupoForm = nuevo GrupoForm({ nombre de usuario: nuevo FormControl() }) canLeave(): booleano { si (este.miformulario.sucio) { if (window.confirm("Hay datos que no se han guardado, ¿estás seguro de que quieres salir?")) { devolver verdadero } demás { devolver falso } } devolver verdadero }
4. Resolve
le permite obtener datos antes de ingresar la ruta y luego ingresar la ruta una vez completada la adquisición de datos.
ng g resolver <name>
importar {Inyectable} de "@angular/core" importar {Resolver} desde "@angular/router" tipo returnType = Promesa<{ nombre: cadena }> @Inyectable({ proporcionado en: "raíz" }) clase de exportación ResolveGuard implementa Resolve<returnType> { resolver(): tipo de retorno { devolver nueva Promesa (función (resolver) { setTimeout(() => { resolver ({ nombre: "Zhang San" }) }, 2000) }) } }
{ camino: "", componente: componente de inicio, resolver: { usuario:ResolveGuard } }
exportar clase HomeComponent { constructor (ruta privada: ActivatedRoute) {} ngOnInit(): nulo { console.log(esta.ruta.instantánea.datos.usuario) } }