Angular - навигация и маршрутизация

Внимание

Данный материал является частью цикла статей «Frontend приложение на Angular». Не забудьте посмотреть другие статьи по этой теме :-)

  1. Angular - Подготовка проекта для нового приложения
  2. Angular - навигация и маршрутизация
  3. Angular - HttpClient, сервисы и файлы окружения
  4. Angular - Ленивая загрузка данных (lazy loading)
  5. Angular - обработка ошибок
  6. Angular - декораторы и директивы @Input и @Output
  7. Angular - валидация формы и POST запрос
  8. Angular - Работа с запросами PUT
  9. Angular - Работа с DELETE запросами

Создание меню навигации в приложении Angular

Итак, начнем с команды Angular CLI:

ng g component menu --skipTests

Мы собираемся использовать классы Bootstrap для реализации меню навигации в файле menu.component.html:

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href="#">Account-Owner Home</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" 
    aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
  
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item">
          <a class="nav-link" href="#">Owner Actions </a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Account Actions </a>
        </li>
      </ul>
    </div>
</nav>

Вот так должен выглядеть файл menu.component.ts:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.css']
})
export class MenuComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }
}

И мы собираемся изменить наш файл app.component.html:

<div class="container">
  <div class="row">
      <div class="col">
        <app-menu></app-menu>
      </div>
  </div>
</div>

Начните свой проект angular, набрав ng serve и перейдите по адресу http://localhost:4200. Вы должны увидеть наше меню на экране:

Настройка маршрутизации Angular

Страница с приветственным сообщением больше недоступна, поскольку мы изменили файл app.component.html. Чтобы включить навигацию между всеми страницами внутри этого проекта, нам нужно настроить маршрутизацию Angular.

Давайте откроем файл app.module.ts и изменим его:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router'

import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { MenuComponent } from './menu/menu.component';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    MenuComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot([
      { path: 'home', component: HomeComponent },
      { path: '', redirectTo: '/home', pathMatch: 'full' }
    ])
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

В этом файле мы можем заметить элемент MenuComponent внутри массива объявлений. Он был импортирован ранее при создании навигационного компонента. Также обратите внимание на RouterModule, который является модулем для маршрутизации Angular. Мы собираемся использовать RouterModule.forRoot для определения маршрутов для нашего приложения.

Когда мы создаем более одного модуля внутри приложения, мы можем использовать функцию forRoot(), предоставляемую модулем RouterModule, только в основном (корневом) модуле. В данном проекте это файл app.module. Во всех остальных модулях мы должны использовать функцию forChild(). Функция forRoot() принимает в качестве параметра массив объектов. Каждый элемент этого массива состоит из пути и целевого компонента для этого пути. Итак, путь: «дом» означает, что по адресу http://localhost:4200/home мы будем обслуживать HomeComponent. Другая строка внутри функции forRoot - это перенаправление по умолчанию на домашнюю страницу.

Обратите внимание, что для больших проектов лучше всего хранить массив маршрутизаторов в отдельном файле, но для простоты этого примера мы храним его внутри функции forRoot.

Чтобы показать домашнюю страницу, измените app.component.html:

<div class="container">
  <div class="row">
      <div class="col">
        <app-menu></app-menu>
      </div>
  </div>
  <div class="row">
    <div class="col">
      <router-outlet></router-outlet>
    </div>
  </div>
</div>

Маршрутизатор-выход - это контейнер для содержимого маршрутизации. Таким образом, весь контент, который существует на адресе, на который вы маршрутизируете, будет представлен внутри этого контейнера.

Теперь, если вы перейдете к localhost:4200, вы должны увидеть следующий результат:

Стилизация ссылок

Если вы хотите изменить стиль своей активной ссылки в меню, измените тег <a>:

<a class="navbar-brand" [routerLink]="['/home']" routerLinkActive="active" 
                [routerLinkActiveOptions]="{exact: true}">Account-Owner Home</a>

С помощью routerLinkActive , мы настраиваем имя класса CSS, которое хотим использовать для стилизации активной ссылки. Кроме того, routerLinkActiveOptions позволит нам добавить класс, только если есть точное совпадение ссылки и URL-адреса.

Теперь в файл menu.component.css мы добавим класс .active:

language

Если мы проверим наше приложение, мы увидим, что ссылка Account-Owner Home теперь белая и жирная.

Создание компонента NotFound

Чтобы завершить часть этого поста, посвященную маршрутизации Angular, мы собираемся создать компонент с именем not-found. Приложение собирается перенаправить пользователя к этому компоненту, когда он вводит в URL-адрес несуществующий маршрут.

Для этого выполним уже знакомую нам команду:

ng g component error-pages/not-found --skipTests

Это структура папок:

Давайте изменим файл not-found.component.ts:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-not-found',
  templateUrl: './not-found.component.html',
  styleUrls: ['./not-found.component.css']
})
export class NotFoundComponent implements OnInit {

  public notFoundText: string = `404 SORRY COULDN'T FIND IT!!!`

  constructor() { }

  ngOnInit() {
  }
}

Обратите внимание на строковое значение переменной notFoundText. Мы используем не апострофы, а обратные кавычки (`). Все содержимое внутри обратных кавычек будет рассматриваться как строка, даже знак апострофа в строке.

Измените файл not-found.component.html:

{{notFoundText}}

Измените файл not-found.component.css:

p{
    font-weight: bold;
    font-size: 50px;
    text-align: center;
    color: #f10b0b;
}

Наконец, измените функцию forRoot в файле app.module.ts:

imports: [
    BrowserModule,
    RouterModule.forRoot([
      { path: 'home', component: HomeComponent },
      { path: '404', component : NotFoundComponent},
      { path: '', redirectTo: '/home', pathMatch: 'full' },
      { path: '**', redirectTo: '/404', pathMatch: 'full'}
    ])
  ],

Вы можете заметить два изменения. При первом изменении мы объявляем путь 404 и назначаем этому пути компонент NotFoundComponent. Теперь наш компонент будет виден на localhost:4200/404. Второе изменение означает, что всякий раз, когда вы ищете какой-либо маршрут, который не соответствует ни одному из наших определенных маршрутов, приложение перенаправляет вас на страницу 404.

При вводе localhost:4200/whatever должен быть получен следующий результат:

Заключение

Как вы могли заметить, создать меню и использовать маршрутизацию в проекте angular довольно просто. Хотя мы не создаем большой проект, он все равно достаточно объемный, чтобы продемонстрировать использование, настройку и маршрутизацию всех страниц, которые у нас есть в настоящее время. Конечно, мы собираемся создать маршруты для всех новых страниц, которые мы представляем в нашем проекте.

Прочитав этот пост, вы узнали:

  • Как создать меню навигации
  • Как создать и настроить маршрутизацию в Angular
  • Способ стилизации ссылок маршрута.

Спасибо, что прочитали этот пост, надеюсь, он был вам полезен.

В следующей статье мы покажем вам, как получать данные с сервера и использовать API с помощью HTTP и Observables.