
В Angular маршрутизация以模块为单位, и каждый модуль может иметь свою собственную маршрутизацию. [Рекомендация по соответствующему руководству: «Учебное пособие по Angular»]
1. Создайте компоненты страницы, компоненты макета и компоненты навигации для использования в маршрутизации.
Создайте компонент домашней страницы ng gc pages/home
Создайте компонент страницы «О нас» ng gc pages/about
Создайте компонент макета ng gc pages/layout
Создайте компонент навигации ng gc pages/navigation
2. Создайте правила маршрутизации
// app.module. тс
импортировать {Маршруты} из "@angular/router"
константные маршруты: Маршруты = [
{
путь: "домой",
компонент:HomeComponent
},
{
путь: «о»,
компонент: ОКомпонент
}
] 3. Внедряем модуль маршрутизации и запускаем
//app.module.ts
импортировать { RouterModule, Routes } из "@angular/router"
@NgModule({
импорт: [RouterModule.forRoot(routes, {useHash: true })],
})
класс экспорта AppModule {} 4. Добавьте路由插座
<!-- Здесь будет отображаться сокет маршрутизации, то есть компонент маршрутизации, соответствующий компоненту-заполнителю --> <router-outlet></router-outlet>5. Определите ссылку
<a routerLink="/home">Домашняя страница</a>
в компоненте навигации.
<a routerLink="/about">О нас</a>
1. Перенаправление
константные маршруты: Маршруты = [
{
путь: "домой",
компонент:HomeComponent
},
{
путь: «о»,
компонент: ОКомпонент
},
{
путь: "",
// Перенаправление redirectTo: "домой",
//Точный путь совпаденияMatch: "full"
}
] 2. Константные маршруты страницы 404
: Маршруты = [
{
путь: "домой",
компонент:HomeComponent
},
{
путь: «о»,
компонент: ОКомпонент
},
{
путь: "**",
компонент: NotFoundComponent
}
] 1. Параметры запроса
<a routerLink="/about" [queryParams]="{ name: 'kitty' }">О нас</a> import { ActivatedRoute } из "@angular/router"
класс экспорта AboutComponent реализует OnInit {
конструктор (частный маршрут: ActivatedRoute) {}
ngOnInit(): пустота {
this.route.queryParamMap.subscribe(query => {
query.get("имя")
})
}
} 2. Динамические параметры
константных маршрутов: Routes = [
{
путь: "домой",
компонент:HomeComponent
},
{
путь: "о/:имя",
компонент: ОКомпонент
}
] <a [routerLink]="['/about', 'zhangsan']">О нас</a>
import { ActivatedRoute } from "@angular/router"
класс экспорта AboutComponent реализует OnInit {
конструктор (частный маршрут: ActivatedRoute) {}
ngOnInit(): пустота {
this.route.paramMap.subscribe(params => {
params.get("имя")
})
}
} Вложенность маршрутов относится к定义子级路由.
константные маршруты: Маршруты = [
{
путь: «о»,
компонент: ОКомпонент,
дети: [
{
путь: «представить»,
компонент: IntroduceComponent
},
{
путь: "история",
компонент: HistoryComponent
}
]
}
] <!-- about.comComponent.html -->
<макет приложения>
<p>о работах!</p>
<a routerLink="/about/introduce">Профиль компании</a>
<a routerLink="/about/history">История разработки</a>
<дел>
<роутер-выход></роутер-выход>
</div>
</app-layout> Назовите сокет
Размещайте дочерние компоненты маршрутизации в различных точках маршрутизации.
{
путь: «о»,
компонент: ОКомпонент,
дети: [
{
путь: «представить»,
компонент: IntroduceComponent,
выход: «левый»
},
{
путь: "история",
компонент: HistoryComponent,
выход: «правильный»
}
]
} <!-- about.comComponent.html --> <макет приложения> <p>о работах!</p> <router-outlet name="left"></router-outlet> <router-outlet name="right"></router-outlet> </app-layout>
<а
[маршрутизатор]="[
'/о',
{
торговые точки: {
слева: ['представить'],
правильно: ['история']
}
}
]"
>О нас</a> <!-- app.comComponent.html --> <button (click)="jump()">Перейти к истории разработки</button>
// app.comComponent.ts
импортировать {Маршрутизатор} из "@angular/router"
класс экспорта HomeComponent {
конструктор (частный маршрутизатор: Маршрутизатор) {}
прыжок() {
this.router.navigate(["/about/history"], {
запросПарамс: {
имя: "Китти"
}
})
}
} Вынесите конфигурацию маршрутизации в корневом модуле в отдельный модуль маршрутизации, называемый根路由模块, а затем добавьте корневой модуль маршрутизации в корневой модуль.
импортировать { NgModule } из "@angular/core"
импортировать { HomeComponent } из "./pages/home/home.comComponent"
импортировать { NotFoundComponent } из "./pages/not-found/not-found.comComponent"
константные маршруты: Маршруты = [
{
путь: "",
компонент:HomeComponent
},
{
путь: "**",
компонент: NotFoundComponent
}
]
@NgModule({
объявления: [],
импорт: [RouterModule.forRoot(routes, {useHash: true })],
// Экспортируем модуль функции маршрутизации Angular, поскольку компонент сокета маршрутизации, предоставленный в модуле RouterModule, используется в корневом компоненте экспорта корневого модуля: [RouterModule]
})
экспортировать класс AppRoutingModule {} импортировать { BrowserModule } из "@angular/platform-browser"
импортировать { NgModule } из "@angular/core"
импортируйте {AppComponent} из "./app.comComponent"
импортировать { AppRoutingModule } из "./app-routing.module"
импортировать { HomeComponent } из "./pages/home/home.comComponent"
импортировать { NotFoundComponent } из "./pages/not-found/not-found.comComponent"
@NgModule({
объявления: [AppComponent, HomeComponent, NotFoundComponent],
импорт: [BrowserModule, AppRoutingModule],
провайдеры: [],
начальная загрузка: [AppComponent]
})
класс экспорта AppModule {} Ленивая загрузка маршрутов основана на模块.
1. Создайте пользовательский модуль ng gm user --routing=true и вместе создайте модуль маршрутизации этого модуля
2. Создайте компонент страницы входа ng gc user/pages/login
3. Создайте компонент страницы регистрации ng gc user/pages/register
4. Правила маршрутизации конфигурации для пользовательских модулей
import { NgModule } из "@angular/core"
import { Routes, RouterModule } из "@angular/router"
импортировать { LoginComponent } из "./pages/login/login.comComponent"
импортировать { RegisterComponent } из "./pages/register/register.comComponent"
константные маршруты: Маршруты = [
{
путь: «логин»,
компонент: LoginComponent
},
{
путь: «зарегистрироваться»,
компонент: РегистрКомпонент
}
]
@NgModule({
импорт: [RouterModule.forChild(маршруты)],
экспорт: [RouterModule]
})
класс экспорта UserRoutingModule {} 5. Свяжите модуль маршрутизации пользователей с основным модулем маршрутизации
// app-routing.module.ts
константные маршруты: Маршруты = [
{
путь: "пользователь",
loadChildren: () => import("./user/user.module").then(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} from "@angular/core"
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } из "@angular/router"
импортировать { Observable } из "rxjs"
@Инъекционный({
предоставлено: "корень"
})
класс экспорта AuthGuard реализует CanActivate {
конструктор (частный маршрутизатор: Маршрутизатор) {}
canActivate(): логическое значение | UrlTree {
// Используется для реализации перехода. return this.router.createUrlTree(["/user/login"])
// Запретить доступ к целевому маршруту return false
//Разрешаем доступ к целевому маршруту, возвращаем true
}
} {
путь: «о»,
компонент: ОКомпонент,
canActivate: [AuthGuard]
} 2. CanActivateChild
проверяет, может ли пользователь получить доступ к определенному подмаршруту.
Создайте охрану маршрута: ng g guard guards/admin Примечание. Чтобы выбрать CanActivateChild, переместите стрелку к этому параметру и коснитесь пробела, чтобы подтвердить выбор.
import { Injectable } из "@angular/core"
импортировать { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } из "@angular/router"
импортировать { Observable } из "rxjs"
@Инъекционный({
предоставлено: "корень"
})
класс экспорта AdminGuard реализует CanActivateChild {
canActivateChild(): логическое значение UrlTree {
вернуть истину
}
} {
путь: «о»,
компонент: ОКомпонент,
canActivateChild: [AdminGuard],
дети: [
{
путь: «представить»,
компонент: IntroduceComponent
}
]
} 3. CanDeactivate
проверяет, может ли пользователь выйти из маршрута.
Например, если содержимое, введенное пользователем в форму, не сохраняется и пользователь хочет сойти с маршрута, можно вызвать охранника, чтобы подсказать пользователю.
import { Injectable } из "@angular/core"
импортировать {
Можно Деактивировать,
Активированный снимок маршрута,
Снимок состояния маршрутизатора,
URLTree
} из "@angular/router"
импортировать { Observable } из "rxjs"
интерфейс экспорта CanComponentLeave {
canLeave: () => логическое значение
}
@Инъекционный({
предоставлено: "корень"
})
класс экспорта UnsaveGuard реализует CanDeactivate<CanComponentLeave> {
canDeactivate (компонент: CanComponentLeave): логическое значение {
если (компонент.canLeave()) {
вернуть истину
}
вернуть ложь
}
} {
путь: "",
компонент: HomeComponent,
canDeactivate: [UnsaveGuard]
} import { 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>
import { Injectable } from "@angular/core"
импортировать {Resolve} из "@angular/router"
тип returnType = Promise<{ name: string }>
@Инъекционный({
предоставлено: "корень"
})
класс экспорта ResolveGuard реализует Resolve<returnType> {
разрешить(): returnType {
вернуть новое обещание (функция (решить) {
setTimeout(() => {
solve({ name: "Чжан Сан" })
}, 2000)
})
}
} {
путь: "",
компонент: HomeComponent,
решать: {
пользователь:ResolveGuard
}
} класс экспорта HomeComponent {
конструктор (частный маршрут: ActivatedRoute) {}
ngOnInit(): пустота {
console.log(this.route.snapshot.data.user)
}
}