Angular использует систему маршрутизации для создания одностраничных приложений (SPA), где маршруты управляют переходами между различными представлениями приложения. Основной задачей маршрутизации является предоставление пользователю плавного и быстрым перехода между компонентами, отображающими различные части интерфейса.
Для того чтобы начать использовать маршрутизацию в Angular,
необходимо настроить RouterModule в основном модуле
приложения. Это делается с помощью метода
RouterModule.forRoot() в массиве imports в
декораторе @NgModule.
Пример базовой конфигурации маршрутов:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'about', component: AboutComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
В данном примере создаются два маршрута:
'' (пустой) направляет пользователя на компонент
HomeComponent.'about' направляет на
AboutComponent.Метод forRoot() используется для конфигурации маршрутов
на уровне всего приложения, а метод forChild() применяется
для настройки маршрутов в дочерних модулях.
Для отображения компонентов в зависимости от текущего маршрута
используется директива router-outlet. Это своего рода
“маркёр” в шаблоне, который Angular заменяет на соответствующий
компонент, когда маршрут совпадает с путём.
<router-outlet></router-outlet>
Когда пользователь переходит по маршруту, Angular автоматически
находит нужный компонент и рендерит его в месте, где находится директива
router-outlet.
Angular позволяет передавать параметры маршрута, что полезно для динамических путей, например, когда нужно отобразить детальную информацию о пользователе по его ID. Для этого в конфигурации маршрутов указывается параметр в пути, который начинается с двоеточия.
Пример маршрута с параметром:
const routes: Routes = [
{ path: 'user/:id', component: UserDetailComponent }
];
В этом примере маршрут 'user/:id' будет соответствовать
любому пути, содержащему идентификатор пользователя (например,
/user/1 или /user/42).
Чтобы получить значение параметра маршрута в компоненте, используется
сервис ActivatedRoute. С помощью его свойства
params можно извлечь параметры маршрута.
Пример получения параметра в компоненте:
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-user-detail',
templateUrl: './user-detail.component.html',
styleUrls: ['./user-detail.component.css']
})
export class UserDetailComponent implements OnInit {
userId: string;
constructor(private route: ActivatedRoute) {}
ngOnInit(): void {
this.userId = this.route.snapshot.paramMap.get('id');
}
}
В данном примере this.route.snapshot.paramMap.get('id')
возвращает значение параметра id из URL.
В Angular можно защитить маршруты, чтобы, например, предотвратить доступ к определённым страницам без авторизации. Для этого используются Route Guards — сервисы, которые реализуют интерфейсы для охраны маршрутов.
Основные типы защитников маршрутов:
Пример использования CanActivate:
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private authService: AuthService, private router: Router) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
if (this.authService.isAuthenticated()) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
}
В данном примере AuthGuard проверяет, авторизован ли пользователь, перед тем как разрешить доступ к защищённому маршруту. Если пользователь не авторизован, его перенаправляют на страницу входа.
Ленивая загрузка (lazy loading) позволяет загружать модули только при
необходимости, что помогает улучшить производительность приложения. Для
этого необходимо использовать метод loadChildren в
конфигурации маршрутов.
Пример ленивая загрузки:
const routes: Routes = [
{ path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule) }
];
В этом примере модуль DashboardModule будет загружен
только тогда, когда пользователь перейдёт по маршруту
'/dashboard'. Для этого Angular использует Webpack или
другой бандлер для разделения кода и подгрузки модулей по
требованию.
При работе с маршрутизацией могут возникать различные ошибки, например, если маршрут не найден. Angular предоставляет механизмы для обработки таких ошибок через настройку 404 страницы.
Пример маршрута для обработки несуществующих маршрутов:
const routes: Routes = [
{ path: 'home', component: HomeComponent },
{ path: '**', component: PageNotFoundComponent }
];
Маршрут с путём ** является универсальным и будет
использоваться, если ни один из других маршрутов не совпадает с текущим.
Это удобно для отображения страницы “Не найдено”, когда пользователь
вводит неверный URL.
Перенаправления позволяют автоматически отправлять пользователя на другой маршрут, если он пытается зайти на устаревшую или неправильную страницу.
Пример перенаправления маршрута:
const routes: Routes = [
{ path: 'old-home', redirectTo: '/home', pathMatch: 'full' }
];
В данном примере при переходе на маршрут '/old-home'
пользователь будет автоматически перенаправлен на
'/home'.
Конфигурация маршрутов в Angular является мощным инструментом для организации навигации в приложении. Используя маршруты, параметры, защита маршрутов и ленивая загрузка, можно создать гибкую и высокоэффективную систему маршрутизации, соответствующую потребностям любого приложения.