모듈별 각도 학습 경로에 대한 간략한 분석

青灯夜游
풀어 주다: 2022-05-23 11:07:10
앞으로
2059명이 탐색했습니다.

이 기사에서는 angular의 라우팅 모듈을 이해하고 일치 규칙, 라우팅 매개변수, 라우팅 중첩, 명명된 소켓, 탐색 라우팅, 라우팅 지연 로딩 등과 같은 관련 지식을 소개합니다. 모든 사람!

모듈별 각도 학습 경로에 대한 간략한 분석

Angular에서 라우팅은 모듈 기반이며 각 모듈은 자체 경로를 가질 수 있습니다. [관련 튜토리얼 권장 사항: "以模块为单位的,每个模块都可以有自己的路由。【相关教程推荐:《angular教程》】

快速上手


1、创建页面组件、Layout 组件以及 Navigation 组件,供路由使用

  • 创建首页页面组件ng g c pages/home

  • 创建关于我们页面组件ng g c pages/about

  • 创建布局组件ng g c pages/layout

  • 创建导航组件ng g c pages/navigation

2、创建路由规则

// app.module.ts
import { Routes } from "@angular/router"

const routes: Routes = [
  {
    path: "home",
    component: HomeComponent
  },
  {
    path: "about",
    component: AboutComponent
  }
]
로그인 후 복사

3、引入路由模块并启动

// app.module.ts
import { RouterModule, Routes } from "@angular/router"

@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: true })],
})
export class AppModule {}
로그인 후 복사

4、添加路由插座

<!-- 路由插座即占位组件 匹配到的路由组件将会显示在这个地方 -->
<router-outlet></router-outlet>
로그인 후 복사

5、在导航组件中定义链接

<a routerLink="/home">首页</a>
<a routerLink="/about">关于我们</a>
로그인 후 복사

匹配规则


1、重定向

const routes: Routes = [
  {
    path: "home",
    component: HomeComponent
  },
  {
    path: "about",
    component: AboutComponent
  },
  {
    path: "",
    // 重定向
    redirectTo: "home",
    // 完全匹配
    pathMatch: "full"
  }
]
로그인 후 복사

2、404 页面

const routes: Routes = [
  {
    path: "home",
    component: HomeComponent
  },
  {
    path: "about",
    component: AboutComponent
  },
  {
    path: "**",
    component: NotFoundComponent
  }
]
로그인 후 복사

路由传参


1、查询参数

<a routerLink="/about" [queryParams]="{ name: &#39;kitty&#39; }">关于我们</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]="[&#39;/about&#39;, &#39;zhangsan&#39;]">关于我们</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")
    })
  }
}
로그인 후 복사

路由嵌套


路由嵌套指的是如何定义子级路由

const routes: Routes = [
  {
    path: "about",
    component: AboutComponent,
    children: [
      {
        path: "introduce",
        component: IntroduceComponent
      },
      {
        path: "history",
        component: HistoryComponent
      }
    ]
  }
]
로그인 후 복사
<!-- 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]="[
      &#39;/about&#39;,
      {
        outlets: {
          left: [&#39;introduce&#39;],
          right: [&#39;history&#39;]
        }
      }
    ]"
    >关于我们
</a>
로그인 후 복사

导航路由


<!-- 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"
      }
    })
  }
}
로그인 후 복사

路由模块


将根模块中的路由配置抽象成一个单独的路由模块,称之为根路由模块,然后在根模块中引入根路由模块。

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 {}
로그인 후 복사
import { BrowserModule } from "@angular/platform-browser"
import { NgModule } from "@angular/core"
import { AppComponent } from "./app.component"
import { AppRoutingModule } from "./app-routing.module"
import { HomeComponent } from "./pages/home/home.component"
import { NotFoundComponent } from "./pages/not-found/not-found.component"

@NgModule({
  declarations: [AppComponent,HomeComponent, NotFoundComponent],
  imports: [BrowserModule, AppRoutingModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}
로그인 후 복사

路由懒加载


路由懒加载是以模块为单位的。

1、创建用户模块 ng g m user --routing=true 一并创建该模块的路由模块

2、创建登录页面组件 ng g c user/pages/login

3、创建注册页面组件 ng g c user/pages/register

4、配置用户模块的路由规则

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 {}
로그인 후 복사

5、将用户路由模块关联到主路由模块

// app-routing.module.ts
const routes: Routes = [
  {
    path: "user",
    loadChildren: () => import("./user/user.module").then(m => m.UserModule)
  }
]
로그인 후 복사

6、在导航组件中添加访问链接

<a routerLink="/user/login">登录</a>
<a routerLink="/user/register">注册</a>
로그인 후 복사

路由守卫


路由守卫会告诉路由是否允许导航到请求的路由。

路由守方法可以返回 booleanObservable <boolean>Promise <boolean>,它们在将来的某个时间点解析为布尔值。

1、CanActivate

检查用户是否可以访问某一个路由

CanActivate 为接口,路由守卫类要实现该接口,该接口规定类中需要有 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、CanActivateChild

检查用户是否方可访问某个子路由。

创建路由守卫:ng g guard guards/admin 注意:选择 CanActivateChild,需要将箭头移动到这个选项并且敲击空格确认选择。

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、CanDeactivate

检查用户是否可以退出路由。

比如用户在表单中输入的内容没有保存,用户又要离开路由,此时可以调用该守卫提示用户。

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、Resolve

允许在进入路由之前先获取数据,待数据获取完成之后再进入路由。

ng g resolver <name>angular 튜토리얼

"]

빠르게 시작하기


1. 라우팅을 위한 페이지 구성 요소, 레이아웃 구성 요소 및 탐색 구성 요소 만들기< br />
  • 홈페이지 페이지 구성 요소 만들기 ng g c 페이지/홈🎜
  • 🎜회사 소개 페이지 구성 요소 만들기 ng g c 페이지/정보🎜
  • 🎜레이아웃 구성 요소 만들기 ng g c 페이지/레이아웃🎜
  • 🎜 탐색 구성 요소 만들기ng g c 페이지/탐색🎜
🎜 2. 라우팅 규칙을 생성합니다🎜
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)
    })
  }
}
로그인 후 복사
🎜3. 라우팅 모듈을 도입하고 시작합니다🎜
{
   path: "",
   component: HomeComponent,
   resolve: {
     user: ResolveGuard
   }
}
로그인 후 복사
🎜4. 라우팅 소켓🎜
export class HomeComponent {
  constructor(private route: ActivatedRoute) {}
  ngOnInit(): void {
    console.log(this.route.snapshot.data.user)
  }
}
로그인 후 복사
🎜5을 추가합니다. 탐색 구성 요소🎜rrreee

일치 규칙

🎜🎜
🎜1. 리디렉션
🎜rrreee🎜2. 404 페이지 🎜rrreee

라우팅 매개변수

🎜🎜🎜1. 쿼리 매개변수
🎜rrreeerrreee🎜2. 동적 매개변수🎜rrreeerrreeerrreee

라우팅 중첩


🎜라우팅 중첩이하위 경로 정의를 참조하는 방식 .
🎜rrreeerrreee🎜명명된 콘센트🎜
🎜하위 라우팅 구성 요소를 다른 라우팅 콘센트 중간에 표시합니다.
🎜rrreeerrreeerrreee

내비게이션 라우팅


rrreeerrreee

라우팅 모듈


🎜루트 모듈의 라우팅 구성을 다음으로 추상화합니다. 별도의 라우팅 모듈을 루트 라우팅 모듈이라고 하며, 루트 모듈에 루트 라우팅 모듈이 도입됩니다.
🎜rrreeerrreee

경로 지연 로딩


🎜경로 지연 로딩은 모듈을 기반으로 합니다.
🎜🎜1. ng g m user --routing=true 사용자 모듈을 만들고 이 모듈의 라우팅 모듈을 함께 만듭니다. 🎜🎜2 로그인 페이지 구성 요소를 만듭니다. user/pages /login🎜🎜3. 등록 페이지 구성 요소 ng g c user/pages/register🎜🎜4를 생성합니다. 사용자 모듈🎜rrreee🎜5의 라우팅 규칙을 구성합니다. 기본 라우팅 모듈에 사용자 라우팅 모듈 🎜rrreee🎜6. 탐색 구성 요소에 액세스 링크를 추가합니다. 🎜rrreee

Route Guard


🎜Route Guard는 요청 라우팅에 대한 탐색을 허용할지 여부를 경로에 알려줍니다.
🎜🎜라우팅 메소드는 boolean, Observable <boolean> 또는 Promise <boolean>을 반환할 수 있습니다. 그들은 미래의 어느 시점에서 부울 값으로 결정됩니다. 🎜🎜1. CanActivate🎜🎜사용자가 특정 경로에 액세스할 수 있는지 확인하세요. 🎜🎜CanActivate는 인터페이스입니다. 경로 가드 클래스는 이 인터페이스를 구현해야 합니다. 인터페이스는 클래스에 대상 경로에 대한 액세스를 허용할지 여부를 결정하는 canActivate 메서드가 있어야 한다고 규정합니다. 🎜🎜경로는 여러 가드를 적용할 수 있습니다. 모든 가드 방법이 허용되는 경우에만 해당 경로에 접근이 허용됩니다. 하나의 가드 방법이 허용되지 않으면 해당 경로에 접근이 허용되지 않습니다. 🎜🎜라우팅 가드 만들기: ng g 가드 가드/인증🎜rrreeerrreee🎜CanActivateChild🎜 🎜사용자가 하위 경로에 접근할 수 있는지 확인하세요. 🎜🎜경로 가드 만들기: ng g Guardguards/admin 참고: CanActivateChild를 선택하려면 화살표를 이 옵션으로 이동하고 공백을 탭하여 선택을 확인해야 합니다. 🎜rrreeerrree🎜3. CanDeactivate🎜🎜사용자가 경로를 종료할 수 있는지 확인하세요. 🎜🎜예를 들어, 사용자가 양식에 입력한 내용은 저장되지 않으며, 사용자가 경로를 벗어나려고 할 때 경비원을 호출하여 사용자에게 알릴 수 있습니다. 🎜rrreeerrreeerrreee🎜4. 해결🎜🎜경로에 진입하기 전에 데이터를 얻은 다음 데이터를 기다립니다. 인수가 완료됩니다. 🎜🎜ng 리졸버 <name>🎜rrreeerrreeerrreee🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜

위 내용은 모듈별 각도 학습 경로에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!