Для удобного перехода между различными частями приложения, как правило, применяется система навигации, состоящая из ссылок. К примеру, возьмем проект из прошлой темы:
В прошлой теме в файле app.config.ts было определено три маршрута:
import { ApplicationConfig } from "@angular/core";
import { provideRouter, Routes } from "@angular/router";
import {HomeComponent} from "./home.component";
import {AboutComponent} from "./about.component";
import {NotFoundComponent} from "./not-found.component";
// определение маршрутов
const appRoutes: Routes =[
{ path: "", component: HomeComponent},
{ path: "about", component: AboutComponent},
{ path: "**", component: NotFoundComponent}
];
export const appConfig: ApplicationConfig = {
providers: [provideRouter(appRoutes)]
};
Компоненты HomeComponent и AboutComponent обрабатывают различные запросы и результат обработки которых вставляется в шаблон главного компонента - класса AppComponent.
Теперь добавим в проект навигацию. Для этого определим в компоненте AppComponent набор ссылок для навигации:
import { Component} from "@angular/core";
import { RouterOutlet, RouterLink} from "@angular/router";
@Component({
selector: "my-app",
imports: [RouterOutlet, RouterLink],
styles: `a {padding: 5px;}`,
template: `<div>
<nav>
<a routerLink="">Главная</a>
<a routerLink="/about">О сайте</a>
</nav>
<router-outlet></router-outlet>
</div>`,
})
export class AppComponent {}
Для определения адресов ссылок применяется директива routerLink, которая импортируется из пакета "@angular/router".
В соответствии с первым маршрутом HomeComponent обрабатывает запросы url без сегментов, поэтому для создания ссылки на этот компонент указывается
пустая строка: <a routerLink="">.
AboutComponent обрабатывает запросы, которые содержат в адресе "about", поэтому ссылка имеет соответствующий адрес: <a routerLink="/about">.
В данном случае стоит отметить слеш, с которого начинается адрес. Если мы определяем набор ссылок в главном компоненте (как здесь), то слеш в принципе можно не
использовать. Если же ссылки определяются в дочерних компонентах, например, в AboutComponent, то без слеша мы можем получить некорректный путь. Слеш позволяет
задать путь относительно корня приложения.
Для стилизации активных ссылок применяется специальная директива routerLinkActive, которая указывает на класс css, применяемый к активной ссылке. Так, изменим класс компонента:
import { Component} from "@angular/core";
import { RouterOutlet, RouterLink, RouterLinkActive} from "@angular/router";
@Component({
selector: "my-app",
imports: [RouterOutlet, RouterLink, RouterLinkActive],
styles: `a {padding: 5px;}
.active {color:red;}`,
template: `<div>
<nav>
<a routerLink="" routerLinkActive="active">Главная</a>
<a routerLink="/about" routerLinkActive="active">О сайте</a>
</nav>
<router-outlet></router-outlet>
</div>`,
})
export class AppComponent {}
В то же время при стилизации следует учитывать следующий момент: если мы нажмем на ссылку "О сайте", то будут стилизованы обе ссылки:
Все дело в том, что путь, представляющий первую ссылку (routerLink=""), совпадает с url второй ссылки (routerLink="/about"),
так как первый путь можно свести к любому другому пути.
В этом случае нам надо применить дополнительные настройки с помощью директивы routerLinkActiveOptions:
<nav>
<a routerLink="" routerLinkActive="active"
[routerLinkActiveOptions]="{exact:true}">Главная</a>
<a routerLink="/about" routerLinkActive="active">О сайте</a>
</nav>
Значение {exact:true} указывает на то, что для установки активной ссылки будет применяться полное соответствие: