ในเชิงมุม การกำหนดเส้นทาง以模块为单位
และแต่ละโมดูลสามารถมีเส้นทางของตัวเองได้ [คำแนะนำบทช่วยสอนที่เกี่ยวข้อง: "บทช่วยสอนเชิงมุม"]
1. สร้างส่วนประกอบของหน้า ส่วนประกอบเค้าโครง และส่วนประกอบการนำทางสำหรับการใช้เส้นทาง
สร้างส่วนประกอบของ โฮมเพจ ng gc pages/home
สร้างส่วนประกอบของหน้า เกี่ยวกับเรา ng gc pages/about
สร้างส่วนประกอบ เค้าโครง ng gc pages/layout
สร้างส่วนประกอบ การนำทาง ng gc pages/navigation
2. สร้างกฎการกำหนดเส้นทาง
// app.module ทีเอส นำเข้า { เส้นทาง } จาก "@เชิงมุม/เราเตอร์" เส้นทาง const: เส้นทาง = [ - เส้นทาง: "บ้าน" ส่วนประกอบ:HomeComponent - - เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent - ]
3. แนะนำโมดูลการกำหนดเส้นทางและเริ่ม
// app.module.ts นำเข้า { RouterModule, เส้นทาง } จาก "@เชิงมุม/เราเตอร์" @NgModule({ การนำเข้า: [RouterModule.forRoot(เส้นทาง, { useHash: true })], - ส่งออกคลาส AppModule {}
4. เพิ่ม路由插座
<!-- ซ็อกเก็ตการกำหนดเส้นทางซึ่งก็คือส่วนประกอบการกำหนดเส้นทางที่ตรงกับส่วนประกอบตัวยึดตำแหน่งจะแสดงที่นี่ --> <router-outlet></router-outlet>5. กำหนดลิงก์
<a routerLink="/home">หน้าแรก</a>
ในส่วนประกอบการนำทาง
<a routerLink="/about">เกี่ยวกับเรา</a>
1. เปลี่ยนเส้นทาง
เส้นทาง const: เส้นทาง = [ - เส้นทาง: "บ้าน" ส่วนประกอบ:HomeComponent - - เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent - - เส้นทาง: "", // เปลี่ยนเส้นทาง เปลี่ยนเส้นทางไปที่: "บ้าน", //การจับคู่แบบตรงทั้งหมด pathMatch: "เต็ม" - ]2.
เส้นทาง const
404 หน้า
: เส้นทาง = [- เส้นทาง: "บ้าน" ส่วนประกอบ:HomeComponent - - เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent - - เส้นทาง: "**", ส่วนประกอบ: NotFoundComponent - ]
1. พารามิเตอร์การค้นหา
<a routerLink="/about" [queryParams]="{ name: 'kitty' }">เกี่ยวกับเรา</a>
นำเข้า { ActivatedRoute } จาก "@เชิงมุม/เราเตอร์" คลาสส่งออก AboutComponent ใช้ OnInit { ตัวสร้าง (เส้นทางส่วนตัว: ActivatedRoute) {} ngOnInit(): เป็นโมฆะ { this.route.queryParamMap.subscribe (แบบสอบถาม => { query.get("ชื่อ") - - }
2.
เส้นทาง const พารามิเตอร์แบบไดนามิก: เส้นทาง = [ - เส้นทาง: "บ้าน" ส่วนประกอบ:HomeComponent - - เส้นทาง: "เกี่ยวกับ/:ชื่อ", ส่วนประกอบ: AboutComponent - ]
<a [routerLink]="['/about', 'zhangsan']">เกี่ยวกับเรา</a>
นำเข้า { ActivatedRoute } จาก "@เชิงมุม/เราเตอร์" คลาสส่งออก AboutComponent ใช้ OnInit { ตัวสร้าง (เส้นทางส่วนตัว: ActivatedRoute) {} ngOnInit(): เป็นโมฆะ { this.route.paramMap.subscribe (params => { params.get("ชื่อ") - - }
การซ้อนเส้นทางหมายถึงวิธีการ定义子级路由
เส้นทาง const: เส้นทาง = [ - เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent, เด็ก: [ - เส้นทาง: "แนะนำ" ส่วนประกอบ: IntroduceComponent - - เส้นทาง: "ประวัติศาสตร์" ส่วนประกอบ: HistoryComponent - - - ]
<!-- about.component.html --> <รูปแบบแอป> <p>เกี่ยวกับผลงาน!</p> <a routerLink="/about/introduce">โปรไฟล์บริษัท</a> <a routerLink="/about/history">ประวัติการพัฒนา</a> <div> <เราเตอร์-เต้าเสียบ></เราเตอร์-เต้าเสียบ> </div> </app-layout>
ตั้งชื่อซ็อกเก็ต
เปิดเผยส่วนประกอบการกำหนดเส้นทางย่อยในช่องทางการจัดเส้นทางที่แตกต่างกัน
- เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent, เด็ก: [ - เส้นทาง: "แนะนำ" ส่วนประกอบ: IntroduceComponent, ทางออก: "ซ้าย" - - เส้นทาง: "ประวัติศาสตร์" ส่วนประกอบ: HistoryComponent, ทางออก: "ถูกต้อง" - - }
<!-- about.component.html --> <รูปแบบแอป> <p>เกี่ยวกับผลงาน!</p> <ชื่อเราเตอร์ร้าน = "ซ้าย"></ เราเตอร์ร้าน> <ชื่อเราเตอร์ร้าน = "ขวา"></ เราเตอร์ร้าน><
/รูปแบบแอป>
<ก [เราเตอร์ลิงค์]="[ '/เกี่ยวกับ', - ร้านค้า: { ซ้าย: ['แนะนำ'], ขวา: ['ประวัติศาสตร์'] - - - >เกี่ยวกับเรา</a>
<!-- app.component.html --> <button (click)="jump()">ข้ามไปยังประวัติการพัฒนา</button>
// app.component.ts นำเข้า { เราเตอร์ } จาก "@เชิงมุม/เราเตอร์" ส่งออกคลาส HomeComponent { ตัวสร้าง (เราเตอร์ส่วนตัว: เราเตอร์) {} กระโดด() { this.router.navigate(["/about/history"], { แบบสอบถามพารามิเตอร์: { ชื่อ: "คิตตี้" - - - }
สรุปการกำหนดค่าการกำหนดเส้นทางในโมดูลรากลงในโมดูลการกำหนดเส้นทางแยกต่างหาก เรียกว่า根路由模块
จากนั้นแนะนำโมดูลการกำหนดเส้นทางรากลงในโมดูลราก
นำเข้า { NgModule } จาก "@เชิงมุม/แกน" นำเข้า { HomeComponent } จาก "./pages/home/home.component" นำเข้า { NotFoundComponent } จาก "./pages/not-found/not-found.component" เส้นทาง const: เส้นทาง = [ - เส้นทาง: "", ส่วนประกอบ:HomeComponent - - เส้นทาง: "**", ส่วนประกอบ: NotFoundComponent - - @NgModule({ ประกาศ: [], การนำเข้า: [RouterModule.forRoot(เส้นทาง, { useHash: true })], // ส่งออกโมดูลฟังก์ชันการกำหนดเส้นทางเชิงมุม เนื่องจากส่วนประกอบซ็อกเก็ตการกำหนดเส้นทางที่ให้ไว้ในโมดูล RouterModule ถูกใช้ในส่วนประกอบรากของการส่งออกโมดูลราก: [RouterModule] - ส่งออกคลาส AppRoutingModule {}
นำเข้า { BrowserModule } จาก "@เชิงมุม/แพลตฟอร์มเบราว์เซอร์" นำเข้า { NgModule } จาก "@เชิงมุม/แกน" นำเข้า {AppComponent} จาก "./app.component" นำเข้า { AppRoutingModule } จาก "./app-routing.module" นำเข้า { HomeComponent } จาก "./pages/home/home.component" นำเข้า { NotFoundComponent } จาก "./pages/not-found/not-found.component" @NgModule({ ประกาศ: [AppComponent, HomeComponent, NotFoundComponent], การนำเข้า: [BrowserModule, AppRoutingModule], ผู้ให้บริการ: [], บูตสแตรป: [AppComponent] - ส่งออกคลาส AppModule {}
การโหลดเส้นทางแบบ Lazy ขึ้นอยู่กับ模块
1. สร้างโมดูลผู้ใช้ ng gm user --routing=true
และสร้างโมดูลการกำหนดเส้นทางของโมดูลนี้ร่วมกัน
2. สร้างส่วนประกอบของหน้าเข้าสู่ระบบ ng gc user/pages/login
3. สร้างส่วนประกอบของหน้าการลงทะเบียน ng gc user/pages/register
4. กฎการกำหนดเส้นทางการกำหนดค่าสำหรับโมดูลผู้ใช้
นำเข้า { NgModule } จาก "@เชิงมุม/core" นำเข้า { เส้นทาง, RouterModule } จาก "@เชิงมุม/เราเตอร์" นำเข้า { LoginComponent } จาก "./pages/login/login.component" นำเข้า { RegisterComponent } จาก "./pages/register/register.component" เส้นทาง const: เส้นทาง = [ - เส้นทาง: "เข้าสู่ระบบ" ส่วนประกอบ: LoginComponent - - เส้นทาง: "ลงทะเบียน", ส่วนประกอบ: RegisterComponent - - @NgModule({ การนำเข้า: [RouterModule.forChild(เส้นทาง)], ส่งออก: [โมดูลเราเตอร์] - ส่งออกคลาส UserRoutingModule {}
5. เชื่อมโยงโมดูลการกำหนดเส้นทางผู้ใช้กับโมดูลการกำหนดเส้นทางหลัก
// app-routing.module.ts เส้นทาง const: เส้นทาง = [ - เส้นทาง: "ผู้ใช้", loadChildren: () => นำเข้า ("./user/user.module"). แล้ว (m => m.UserModule) - ]6. เพิ่มลิงก์การเข้าถึง
<a routerLink="/user/login">เข้าสู่ระบบ</a>
ในส่วนประกอบการนำทาง
<a routerLink="/user/register">ลงทะเบียน</a>
เจ้าหน้าที่รักษาเส้นทางจะบอกเส้นทางว่าอนุญาตให้นำทางไปยังเส้นทางที่ร้องขอได้หรือไม่
วิธีการป้องกันเส้นทางสามารถส่งคืน boolean
หรือ Observable <boolean>
หรือ Promise <boolean>
ซึ่งแก้ไขเป็นค่าบูลีน ณ จุดใดจุดหนึ่งในอนาคต
1. CanActivate
ตรวจสอบ是否可以访问某一个路由
CanActivate为接口
และคลาสป้องกันเส้นทางต้องใช้อินเทอร์เฟซนี้ อินเทอร์เฟซนี้กำหนดว่าคลาสจำเป็นต้องมีเมธอด canActivate ซึ่งกำหนดว่าจะอนุญาตการเข้าถึงเส้นทางเป้าหมายหรือไม่
เส้นทางสามารถใช้多个守卫
หากอนุญาตวิธีป้องกันทั้งหมด จะอนุญาตให้เข้าถึงเส้นทางได้ หากไม่อนุญาตให้ใช้วิธีป้องกันวิธีใดวิธีหนึ่ง
สร้างตัวป้องกันเส้นทาง: ng g guard guards/auth
import { Injectable } จาก "@เชิงมุม/core" นำเข้า { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, เราเตอร์ } จาก "@เชิงมุม/เราเตอร์" นำเข้า { สังเกตได้ } จาก "rxjs" @ฉีด({ ให้ไว้ใน: "ราก" - คลาสส่งออก AuthGuard ใช้ CanActivate { ตัวสร้าง (เราเตอร์ส่วนตัว: เราเตอร์) {} canActivate(): บูลีน | . // ใช้เพื่อใช้ Jump return this.router.createUrlTree(["/user/login"]) // ปิดการเข้าถึงเส้นทางเป้าหมาย return false //อนุญาตให้เข้าถึงเส้นทางเป้าหมายคืนค่าจริง - }
{ เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent, สามารถเปิดใช้งาน: [AuthGuard] }
2. CanActivateChild
ตรวจสอบว่าผู้ใช้สามารถเข้าถึงเส้นทางย่อยบางเส้นทางได้หรือไม่
สร้างการป้องกันเส้นทาง: ng g guard guards/admin
หมายเหตุ: หากต้องการเลือก CanActivateChild ให้เลื่อนลูกศรไปที่ตัวเลือกนี้แล้วแตะช่องว่างเพื่อยืนยันการเลือก
นำเข้า { ฉีดได้ } จาก "@เชิงมุม/แกน" นำเข้า { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } จาก "@เชิงมุม/เราเตอร์" นำเข้า { สังเกตได้ } จาก "rxjs" @ฉีด({ ให้ไว้ใน: "ราก" - คลาสส่งออก AdminGuard ใช้ CanActivateChild { canActivateChild(): บูลีน | . กลับเป็นจริง - }
{ เส้นทาง: "เกี่ยวกับ" ส่วนประกอบ: AboutComponent, canActivateChild: [ผู้ดูแลระบบ], เด็ก: [ - เส้นทาง: "แนะนำ" ส่วนประกอบ: IntroduceComponent - - }
3. CanDeactivate
ตรวจสอบว่าผู้ใช้สามารถออกจากเส้นทางได้หรือไม่
ตัวอย่างเช่น หากเนื้อหาที่ผู้ใช้ป้อนในแบบฟอร์มไม่ได้รับการบันทึก และผู้ใช้ต้องการออกจากเส้นทาง ก็สามารถเรียกเจ้าหน้าที่รักษาความปลอดภัยมาแจ้งให้ผู้ใช้ทราบได้
นำเข้า { ฉีดได้ } จาก "@เชิงมุม/แกน" นำเข้า { สามารถปิดการใช้งานได้, เปิดใช้งานRouteSnapshot, RouterStateSnapshot, UrlTree } จาก "@เชิงมุม/เราเตอร์" นำเข้า { สังเกตได้ } จาก "rxjs" อินเทอร์เฟซการส่งออก CanComponentLeave { canLeave: () => บูลีน - @ฉีด({ ให้ไว้ใน: "ราก" - คลาสส่งออก UnsaveGuard ใช้ CanDeactivate<CanComponentLeave> { canDeactivate (ส่วนประกอบ: CanComponentLeave): บูลีน { ถ้า (component.canLeave()) { กลับเป็นจริง - กลับเท็จ - }
{ เส้นทาง: "", ส่วนประกอบ: HomeComponent, สามารถปิดการใช้งาน: [UnsaveGuard] }
นำเข้า { CanComponentLeave } จาก "src/app/guards/unsave.guard" คลาสส่งออก HomeComponent ใช้ CanComponentLeave { myForm: FormGroup = FormGroup ใหม่ ({ ชื่อผู้ใช้: FormControl ใหม่ () - canLeave(): บูลีน { ถ้า (this.myForm.dirty) { if (window.confirm("มีข้อมูลที่ยังไม่ได้บันทึก คุณแน่ใจหรือไม่ว่าต้องการออก?")) { กลับเป็นจริง } อื่น { กลับเท็จ - - กลับเป็นจริง }
4. Resolve
ช่วยให้คุณได้รับข้อมูลก่อนที่จะเข้าสู่การกำหนดเส้นทาง จากนั้นจึงเข้าสู่การกำหนดเส้นทางหลังจากการรับข้อมูลเสร็จสิ้น
ng g resolver <name>
นำเข้า { ฉีดได้ } จาก "@เชิงมุม/แกน" นำเข้า { แก้ไข } จาก "@เชิงมุม/เราเตอร์" พิมพ์ returnType = สัญญา<{ ชื่อ: สตริง }> @ฉีด({ ให้ไว้ใน: "ราก" - คลาสส่งออก ResolveGuard ใช้งาน Resolve<returnType> { แก้ไข (): returnType { คืนสัญญาใหม่ (ฟังก์ชั่น (แก้ไข) { setTimeout(() => { แก้ไข ({ ชื่อ: "จางซาน" }) }, 2000) - - }
{ เส้นทาง: "", ส่วนประกอบ: HomeComponent, แก้ไข: { ผู้ใช้:ResolveGuard - }
ส่งออกคลาส HomeComponent { ตัวสร้าง (เส้นทางส่วนตัว: ActivatedRoute) {} ngOnInit(): เป็นโมฆะ { console.log (this.route.snapshot.data.user) - -