Rumah >hujung hadapan web >tutorial js >Ketahui lebih lanjut tentang penghalaan dalam Angular dan bagaimana untuk bermula dengan cepat?
Artikel ini akan memberi anda pemahaman yang mendalam tentang penghalaan dalam Sudut, lihat cara untuk bermula dengan cepat dan memperkenalkan peraturan padanan, parameter penghalaan, sarang penghalaan, pengawal penghalaan, dll. Saya harap ia akan berguna kepada semua orang.
Dalam Angular
, penghalaan adalah berdasarkan modul dan setiap modul boleh mempunyai laluannya sendiri. [Tutorial berkaitan yang disyorkan: "tutorial sudut"]
Buat komponen halaman, Layout
komponen dan Navigation
komponen , Untuk kegunaan penghalaan
Buat Halaman UtamaKomponen halamanng g c pages/home
Buat Mengenai Kami Halaman Komponenng g c pages/about
BuatReka LetakKomponenng g c pages/layout
BuatNavigasiKomponen ng g c pages/navigation
Buat peraturan penghalaan
// app.module.ts import { Routes } from "@angular/router" const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about", component: AboutComponent } ]
Perkenalkan modul penghalaan dan mulakannya
// app.module.ts import { RouterModule, Routes } from "@angular/router" @NgModule({ imports: [RouterModule.forRoot(routes, { useHash: true })], }) export class AppModule {}
Tambah soket penghalaan
<!-- 路由插座即占位组件 匹配到的路由组件将会显示在这个地方 --> <router-outlet></router-outlet>
Tentukan pautan dalam komponen navigasi
<a routerLink="/home">首页</a> <a routerLink="/about">关于我们</a>
1 Ubah hala
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about", component: AboutComponent }, { path: "", // 重定向 redirectTo: "home", // 完全匹配 pathMatch: "full" } ]
2 <span style="font-size: 16px;">404</span>
404
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "**", component: NotFoundComponent } ]Parameter laluan
<a routerLink="/about" [queryParams]="{ name: 'kitty' }">关于我们</a>
import { ActivatedRoute } from "@angular/router" export class AboutComponent implements OnInit { constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.route.queryParamMap.subscribe(query => { query.get("name") }) } }
2 >
const routes: Routes = [ { path: "home", component: HomeComponent }, { path: "about/:name", component: AboutComponent } ]
<a [routerLink]="['/about', 'zhangsan']">关于我们</a>
import { ActivatedRoute } from "@angular/router" export class AboutComponent implements OnInit { constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.route.paramMap.subscribe(params => { params.get("name") }) } }Sarang laluan
const routes: Routes = [ { path: "about", component: AboutComponent, children: [ { path: "introduce", component: IntroduceComponent }, { path: "history", component: HistoryComponent } ] } ]Cawangan bernama
<!-- about.component.html --> <app-layout> <p>about works!</p> <a routerLink="/about/introduce">公司简介</a> <a routerLink="/about/history">发展历史</a> <div> <router-outlet></router-outlet> </div> </app-layout>
{ path: "about", component: AboutComponent, children: [ { path: "introduce", component: IntroduceComponent, outlet: "left" }, { path: "history", component: HistoryComponent, outlet: "right" } ] }
<!-- about.component.html --> <app-layout> <p>about works!</p> <router-outlet name="left"></router-outlet> <router-outlet name="right"></router-outlet> </app-layout>
<a [routerLink]="[ '/about', { outlets: { left: ['introduce'], right: ['history'] } } ]" >关于我们</a>Penghalaan navigasi
<!-- app.component.html --> <button (click)="jump()">跳转到发展历史</button>
// app.component.ts import { Router } from "@angular/router" export class HomeComponent { constructor(private router: Router) {} jump() { this.router.navigate(["/about/history"], { queryParams: { name: "Kitty" } }) } }Modul penghalaan
import { NgModule } from "@angular/core" import { HomeComponent } from "./pages/home/home.component" import { NotFoundComponent } from "./pages/not-found/not-found.component" const routes: Routes = [ { path: "", component: HomeComponent }, { path: "**", component: NotFoundComponent } ] @NgModule({ declarations: [], imports: [RouterModule.forRoot(routes, { useHash: true })], // 导出 Angular 路由功能模块,因为在根模块的根组件中使用了 RouterModule 模块中提供的路由插座组件 exports: [RouterModule] }) export class AppRoutingModule {}Malas memuatkan laluan
import { BrowserModule } from "@angular/platform-browser" import { NgModule } from "@angular/core" import { AppComponent } from "./app.component" import { AppRoutingModule } from "./app-routing.module" @NgModule({ declarations: [AppComponent], imports: [BrowserModule, AppRoutingModule], providers: [], bootstrap: [AppComponent] }) export class AppModule {}
ng g m user --routing=true
ng g c user/pages/login
ng g c user/pages/register
import { NgModule } from "@angular/core" import { Routes, RouterModule } from "@angular/router" import { LoginComponent } from "./pages/login/login.component" import { RegisterComponent } from "./pages/register/register.component" const routes: Routes = [ { path: "login", component: LoginComponent }, { path: "register", component: RegisterComponent } ] @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class UserRoutingModule {}
// app-routing.module.ts const routes: Routes = [ { path: "user", loadChildren: () => import("./user/user.module").then(m => m.UserModule) } ]
<a routerLink="/user/login">登录</a> <a routerLink="/user/register">注册</a>
Kaedah pengawal laluan boleh mengembalikan
atau atau boolean
, yang pada satu ketika pada masa hadapan menyelesaikan kepada nilai Boolean Observable 78180fd7e2f5f09e138c95a71ada14e6
Promise 78180fd7e2f5f09e138c95a71ada14e6
1, <span style="font-size: 16px;">CanActivate</span>
<span style="font-size: 16px;">CanActivate</span>
ialah antara muka, dan kelas pengawal laluan mesti melaksanakan antara muka ini. Antara muka menetapkan bahawa kelas perlu mempunyai kaedah CanActivate
, yang menentukan sama ada untuk membenarkan akses kepada laluan sasaran. canActivate
ng g guard guards/auth
import { Injectable } from "@angular/core" import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from "@angular/router" import { Observable } from "rxjs" @Injectable({ providedIn: "root" }) export class AuthGuard implements CanActivate { constructor(private router: Router) {} canActivate(): boolean | UrlTree { // 用于实现跳转 return this.router.createUrlTree(["/user/login"]) // 禁止访问目标路由 return false // 允许访问目标路由 return true } }
{ path: "about", component: AboutComponent, canActivate: [AuthGuard] }
2, <span style="font-size: 16px;">CanActivateChild</span>
Semak sama ada pengguna boleh mengakses sub-laluan.
Buat pengawal laluan: ng g guard guards/admin
Nota: Untuk memilih
CanActivateChild
, anda perlu mengalihkan anak panah ke pilihan ini dan ketik ruang untuk mengesahkan pemilihan
import { Injectable } from "@angular/core" import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from "@angular/router" import { Observable } from "rxjs" @Injectable({ providedIn: "root" }) export class AdminGuard implements CanActivateChild { canActivateChild(): boolean | UrlTree { return true } }
{ path: "about", component: AboutComponent, canActivateChild: [AdminGuard], children: [ { path: "introduce", component: IntroduceComponent } ] }
3 <span style="font-size: 16px;">CanDeactivate</span>
Boleh Nyahaktifkan
import { Injectable } from "@angular/core" import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from "@angular/router" import { Observable } from "rxjs" export interface CanComponentLeave { canLeave: () => boolean } @Injectable({ providedIn: "root" }) export class UnsaveGuard implements CanDeactivate<CanComponentLeave> { canDeactivate(component: CanComponentLeave): boolean { if (component.canLeave()) { return true } return false } }
{ path: "", component: HomeComponent, canDeactivate: [UnsaveGuard] }
import { CanComponentLeave } from "src/app/guards/unsave.guard" export class HomeComponent implements CanComponentLeave { myForm: FormGroup = new FormGroup({ username: new FormControl() }) canLeave(): boolean { if (this.myForm.dirty) { if (window.confirm("有数据未保存, 确定要离开吗")) { return true } else { return false } } return true }
4, <span style="font-size: 16px;">Resolve</span>
>
$ ng g resolver <name>Membenarkan data diperoleh sebelum memasuki laluan, dan kemudian memasuki laluan selepas pemerolehan data selesai
import { Injectable } from "@angular/core" import { Resolve } from "@angular/router" type returnType = Promise<{ name: string }> @Injectable({ providedIn: "root" }) export class ResolveGuard implements Resolve<returnType> { resolve(): returnType { return new Promise(function (resolve) { setTimeout(() => { resolve({ name: "张三" }) }, 2000) }) } }
{ path: "", component: HomeComponent, resolve: { user: ResolveGuard } }
export class HomeComponent { constructor(private route: ActivatedRoute) {} ngOnInit(): void { console.log(this.route.snapshot.data.user) } }
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati:
Video Pengaturcaraan! !Atas ialah kandungan terperinci Ketahui lebih lanjut tentang penghalaan dalam Angular dan bagaimana untuk bermula dengan cepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!