Angular предоставляет мощный механизм для навигации между различными частями приложения. Это достигается через систему маршрутизации (Router), которая позволяет определять, какие компоненты должны отображаться в зависимости от URL. Важной особенностью маршрутизатора Angular является его способность работать с динамическими путями, ленивой загрузкой и разрешителями данных.
Путь — это URL-шаблон, который соответствует определённому
компоненту. В Angular пути настраиваются через объект маршрутизации, где
каждому пути соответствует компонент, который будет отображён. Например,
настройка для пути /home может выглядеть так:
const routes: Routes = [
{ path: 'home', component: HomeComponent }
];
Каждый путь в массиве маршрутов ассоциирован с конкретным компонентом, который будет загружен при переходе на этот путь.
Модуль маршрутизации — это основная часть настройки маршрутов в
Angular. Он импортирует объект маршрутизации и конфигурирует его в
корневом модуле приложения. Для этого используется класс
RouterModule, который подключается к массиву
imports в корневом модуле:
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppModule {}
Метод forRoot() инициализирует маршрутизатор с корневыми
маршрутами и использует их для настройки маршрутов на уровне всего
приложения.
Для навигации между путями используется директива
routerLink, которая позволяет переходить на другие страницы
без перезагрузки всего приложения:
<a routerLink="/home">Перейти на главную</a>
Для динамической навигации используется сервис Router.
Он позволяет программно изменить путь, что полезно при переходах в ответ
на события или действия пользователя:
import { Router } from '@angular/router';
constructor(private router: Router) {}
navigateToHome() {
this.router.navigate(['/home']);
}
Angular позволяет использовать параметры в маршрутах, что даёт возможность строить динамичные страницы с уникальным содержимым. Параметры маршрута определяются в пути, например:
const routes: Routes = [
{ path: 'user/:id', component: UserComponent }
];
В данном примере параметр id будет доступен в компоненте
UserComponent. Для извлечения значения параметра
используется сервис ActivatedRoute:
import { ActivatedRoute } from '@angular/router';
constructor(private route: ActivatedRoute) {}
ngOnInit() {
const userId = this.route.snapshot.paramMap.get('id');
}
Важным моментом является использование метода snapshot,
который позволяет получить значения параметров маршрута в момент
инициализации компонента. Также существует метод params,
который предоставляет Observable, отслеживающий изменения
параметров.
Ленивая загрузка позволяет загружать части приложения только по мере
их необходимости, что повышает производительность и уменьшает время
начальной загрузки. В Angular ленивую загрузку можно настроить с помощью
модуля маршрутизации, используя функцию loadChildren,
которая динамически загружает модуль, когда к нему происходит
переход:
const routes: Routes = [
{ path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) }
];
При переходе на путь /admin Angular автоматически
загружает модуль AdminModule, если он ещё не был загружен.
Это особенно полезно для крупных приложений с множеством функциональных
модулей.
Редиректы позволяют перенаправлять пользователя с одного пути на
другой. Это можно сделать с помощью параметра
redirectTo:
const routes: Routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' }
];
В этом примере при переходе на пустой путь ('')
пользователь будет перенаправлен на путь /home. Параметр
pathMatch может быть задан как full или
prefix, в зависимости от того, как именно будет
сравниваться путь.
Для защиты маршрутов от несанкционированного доступа используется
механизм охраны маршрутов (Route Guards). Эти охраны позволяют управлять
доступом к различным частям приложения, проверяя определённые условия,
такие как наличие авторизации. Охрана маршрута может быть настроена с
помощью интерфейса CanActivate, который реализует логика
проверки перед переходом:
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(): boolean {
if (this.authService.isAuthenticated()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}
Данная охрана проверяет, авторизован ли пользователь, и в случае отрицательного ответа перенаправляет его на страницу входа.
Охраны могут быть также использованы для защиты от нежелательных
переходов с помощью интерфейсов CanActivateChild,
CanLoad, CanDeactivate.
Angular поддерживает две основные стратегии маршрутизации:
http://example.com/home.#. Это используется для
обеспечения совместимости с более старыми браузерами или при
ограничениях на сервере.Для использования стратегии с хешем можно настроить маршрутизатор следующим образом:
@NgModule({
imports: [RouterModule.forRoot(routes, { useHash: true })],
exports: [RouterModule]
})
export class AppModule {}
При переходе на новый маршрут часто бывает нужно передавать не только параметры пути, но и дополнительные данные. В Angular для этого предусмотрены два способа: state и query parameters.
Параметры запроса добавляются к URL с помощью
queryParams:
this.router.navigate(['/search'], { queryParams: { term: 'angular' } });
Эти параметры можно получить через ActivatedRoute:
ngOnInit() {
this.route.queryParams.subscribe(params => {
console.log(params['term']);
});
}
State позволяет передавать более сложные данные, которые не отображаются в URL, но могут быть использованы для переноса состояния:
this.router.navigate(['/home'], { state: { user: 'JohnDoe' } });
Для получения состояния используется history.state:
ngOnInit() {
const state = history.state;
console.log(state.user);
}
Angular предоставляет возможность отслеживать изменения маршрута с
помощью Router и ActivatedRoute. Это может
быть полезно, например, для выполнения определённых действий при каждом
переходе:
this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
console.log('Navigation started');
}
});
Это позволяет реагировать на события маршрутизации, такие как начало, завершение или ошибка навигации.
Маршрутизатор Angular является ключевым элементом для разработки многокомпонентных веб-приложений. Он предоставляет гибкие возможности для работы с динамическими путями, ленивой загрузкой, редиректами и охраной маршрутов. Понимание принципов маршрутизации и умение эффективно использовать её возможности позволяет создавать приложения с высокой производительностью и хорошей пользовательской навигацией.