Как работает routing в Angular?

Routing (маршрутизация) в Angular — это механизм, позволяющий навигировать между разными представлениями (компонентами) в одностраничном приложении (SPA), изменяя URL без перезагрузки страницы. Angular Router — это встроенный модуль, который отвечает за отображение компонентов в зависимости от текущего маршрута.

1. Установка и подключение маршрутизатора

Для работы маршрутизации необходимо подключить модуль RouterModule в корневом или фиче-модуле:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = \[/\* маршруты \*/\];
@NgModule({
imports: \[RouterModule.forRoot(routes)\],
exports: \[RouterModule\]
})
export class AppRoutingModule {}

2. Определение маршрутов

Маршруты определяются как массив объектов типа Route. Каждый маршрут связывает путь URL с компонентом.

const routes: Routes = \[
{ path: '', component: HomeComponent },
{ path: 'about', component: AboutComponent },
{ path: 'users/:id', component: UserComponent },
{ path: '\*\*', component: NotFoundComponent }
\];

Пояснение:

  • path: '' — путь по умолчанию.

  • path: 'about' — статический маршрут.

  • path: 'users/:id' — динамический маршрут с параметром.

  • path: '**' — wildcard (обрабатывает все несуществующие пути, часто используется для 404).

3. Использование маршрутов в шаблоне

3.1. Навигация

С помощью директивы routerLink:

<a routerLink="/about">О нас</a>
<a \[routerLink\]="\['/users', userId\]">Профиль</a>

Для активной ссылки:

<a routerLink="/home" routerLinkActive="active">Домой</a>

3.2. Вывод компонента

Нужно разместить <router-outlet></router-outlet> в шаблоне — это место, куда Angular будет подставлять компоненты согласно маршрутам:

&lt;router-outlet&gt;&lt;/router-outlet&gt;

4. Параметры маршрута

4.1. Параметры URL

Если маршрут содержит :id, его можно получить через ActivatedRoute:

constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.route.params.subscribe(params => {
console.log(params\['id'\]);
});
}

Или через snapshot:

const id = this.route.snapshot.paramMap.get('id');

4.2. Query параметры

URL: /search?term=angular&page=2

this.route.queryParams.subscribe(params => {
console.log(params\['term'\], params\['page'\]);
});

Передача:

&lt;a \[routerLink\]="\['/search'\]" \[queryParams\]="{ term: 'angular', page: 2 }"&gt;Поиск&lt;/a&gt;

5. Программная навигация

Сервис Router позволяет управлять навигацией программно:

constructor(private router: Router) {}
goToUser(id: string) {
this.router.navigate(\['/users', id\]);
}

С query параметрами:

this.router.navigate(\['/search'\], { queryParams: { term: 'vue' } });

6. Дочерние маршруты (nested routes)

Для вложенной навигации один компонент может иметь собственные children:

const routes: Routes = \[
{
path: 'admin',
component: AdminComponent,
children: \[
{ path: 'dashboard', component: DashboardComponent },
{ path: 'settings', component: SettingsComponent }
\]
}
\];

В шаблоне AdminComponent должен быть <router-outlet> для отображения дочерних компонентов.

7. Переадресация и путь по умолчанию

const routes: Routes = \[
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ path: '\*\*', component: NotFoundComponent }
\];
  • redirectTo — перенаправление.

  • pathMatch: 'full' — полное совпадение пути ('').

  • ** — wildcard для обработки несуществующих маршрутов.

8. Ленивая загрузка (Lazy Loading)

Позволяет загружать модули и их маршруты только при необходимости.

Шаг 1: Создание модуля с маршрутом

const routes: Routes = \[
{ path: '', component: LazyComponent }
\];
@NgModule({
declarations: \[LazyComponent\],
imports: \[RouterModule.forChild(routes)\]
})
export class LazyModule {}

Шаг 2: Подключение в основном маршруте

const routes: Routes = \[
{
path: 'lazy',
loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)
}
\];

9. Guards — защита маршрутов

Можно ограничивать доступ к маршрутам с помощью Guard-ов.

{ path: 'admin', component: AdminComponent, canActivate: \[AuthGuard\] }

Типы Guard-ов:

Guard Назначение
canActivate Проверяет возможность открытия маршрута
--- ---
canDeactivate Проверяет возможность выхода с маршрута
--- ---
canActivateChild Для вложенных маршрутов
--- ---
resolve Загружает данные до активации маршрута
--- ---
canLoad Контролирует возможность загрузки модуля
--- ---

Пример AuthGuard:

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate(): boolean {
if (this.auth.isLoggedIn()) return true;
this.router.navigate(\['/login'\]);
return false;
}
}

10. Preloading Strategy

Для предварительной загрузки лениво подключённых модулей:

RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })

Это позволяет ускорить навигацию, загружая модули в фоне после загрузки основного приложения.

11. Навигация с сохранением истории

Angular использует LocationStrategy, по умолчанию — HTML5 (без #):

{ provide: LocationStrategy, useClass: PathLocationStrategy }

Если нужно использовать hash-навигацию (например, для старых серверов):

{ provide: LocationStrategy, useClass: HashLocationStrategy }

12. Навигация при помощи события

Сервис Router предоставляет Observable events:

this.router.events.subscribe(event => {
if (event instanceof NavigationStart) {
console.log('Переход начался');
}
if (event instanceof NavigationEnd) {
console.log('Переход завершён');
}
});

Полезно для отображения спиннеров, логирования, анимаций переходов.

13. Восстановление прокрутки

Для сохранения позиции прокрутки при навигации:

RouterModule.forRoot(routes, {
scrollPositionRestoration: 'enabled'
});

Опции:

  • 'disabled'

  • 'enabled'

  • 'top'

14. Анимации при переходах

Можно реализовать переходы между компонентами с анимацией с помощью Angular Animations, используя router-outlet и @routeAnimations.

Пример в шаблоне:

&lt;div \[@routeAnimations\]="prepRouteState(outlet)"&gt;
&lt;router-outlet #outlet="outlet"&gt;&lt;/router-outlet&gt;
&lt;/div&gt;

15. Повторное использование компонентов

По умолчанию Angular уничтожает компонент при уходе с маршрута. Можно настроить RouteReuseStrategy, чтобы переиспользовать компонент (например, кэшировать страницу).

16. Поддержка параметров в URL

Можно комбинировать params, queryParams, fragment и data для гибкой настройки маршрутов.