Определение маршрутов¶
Маршрутизация позволяет сопоставлять запросы к приложению с определенными ресурсами внутри приложения.
Ключевым для работы маршрутизации является модуль RouterModule, который располагается в пакете @angular/router. Поэтому при работе с маршрутизацией этот пакет должен быть указан в списке зависимостей в файле package.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Для определения маршрутов возьмем базовую структуру приложения:
Для работы с маршрутизацией в первую очередь стоит определить базовый адрес приложения. Для этого возьмем веб-страницу index.html и добавим в секцию <head> элемент <base>:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
В качестве базового адреса будет рассматриваться корень приложения.
Каждый маршрут сопоставляется с определенным компонентом. Поэтому добавим в проект ряд компонентов. Так, добавим в папку src/app новый файл home.component.ts:
1 2 3 4 5 6 7 | |
Этот простенький компонент выводит обычный заголовок.
Далее добавим в папку src/app новый файл about.component.ts:
1 2 3 4 5 6 7 | |
И также добавим еще один файл not-found.component.ts:
1 2 3 4 5 6 7 | |
RouterModule и добавление маршрутов¶
Итак, кроме главного компонента AppComponent в проекте определено еще три компонента, каждый из которых просто выводит некоторый заголовок. Для каждого из этих компонентов мы можем определить свой маршрут. Для этого изменим код модуля AppModule:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Во-первых, здесь импортируются модуль маршрутизации RouterModule и класс Routes, представляющий коллекцию маршрутов:
1 | |
Далее определяется сам набор маршрутов:
1 2 3 4 5 | |
Здесь определено три маршрута, каждый из которых будет обрабатываться отдельным компонентом. Для указания маршрута применяется параметр path. Например, путь about будет представлять запрос типа http://localhost:3000/about и будет обрабатываться классом AboutComponent.
Если запрос не содержит никаких сегментов, например, просто имя домена http://localhost:3000/, то такой запрос будет сопоставляться с путем "" (пустая строка) и будет обрабатываться компонентом HomeComponent.
Если приложение получит запрос, который не подходит ни под один из выше определенных маршрутов, то он будет сопоставляться с шаблоном **, где две звездочки представляют любой путь.
Чтобы применить маршруты, они передаются в метод RouterModule.forRoot(appRoutes):
1 | |
Метод RouterModule.forRoot() возвращает модуль, который содержит сконфигурированный сервис Router. Когда приложение загружается, Router выполняет начальную навигацию по текущему URL, который стоит в адресной строке браузера.
RouterOutlet¶
Мы определили три разных компонента для разных маршрутов, однако в качестве главного компонента выступает AppComponent. Этот компонент выступает в качестве контейнера для остальных компонентов, которые будут обслуживать запросы к приложению.
Но чтобы можно было внедрить в AppComponent тот компонент, который обрабатывает запрос, необходимо использовать элемент RouterOutlet. Для этого изменим код AppComponent:
1 2 3 4 5 6 7 8 9 10 11 12 | |
На место элемента <router-outlet> будет рендериться компонент, выбранный для обработки запроса.
Если при разработке применяется webpack, нужно определить в файле webpack.config.js следующую секцию:
1 2 3 | |
То есть файл webpack.config.js может выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | |
Запустим приложение. По умолчанию приложение запускается без сегментов, поэтому запрос обрабатывает HomeComponent:
Перейдем по пути localhost:xxxx/about:
При переходе к любому другому адресу сработает компонент NotFoundComponent:
URL Matching и порядок маршрутов¶
Когда будет выполняться переход по определенному пути, например, /about, система маршрутизации сопоставляет последовательно URL запроса с параметрами path у каждого маршрута. Данный процесс называется url matching. В частности, система маршрутизации сопоставит url /about с маршрутом { path: 'about', component: AboutComponent}. И компонент AboutComponent будет выбран для обработки запроса по пути /about.
Но при определении маршрутов следует учитывать их порядок. Вполне возможно, что под определенный запрос будет соответствовать сразу несколько маршрутов. В этом случае запрос будет обрабатываться первым из них. Другие же маршруты не будут учитываться. Например, если мы изменим порядок маршрутов:
1 2 3 4 5 | |
То в этом случае запрос /about будет обрабатываться первым маршрутом, поскольку он соответствует запросу /about (путь ** соответствует любому набору символов). Поэтому маршрут
1 | |
лучше определить последним — для всех тех запросов, которые не будут соответствовать ни одному из выше определенных маршрутов.
Переадресация¶
Вполне возможно, что по какому-то маршруту мы захотим сделать переадресацию по другому пути. Например, в случае, если нужного маршрута для запроса не найдено, мы можем переадресовать на главную страницу:
1 2 3 4 5 | |
Для переадресации указываем параметр redirectTo. Его значение представляет путь переадресации. В данном случае слеш указывает на первый маршрут или на главную страницу.
Также мы можем задать критерий соответствия строки запроса маршруту с помощью параметра pathMatch:
1 2 3 4 5 6 7 8 9 10 | |
Значение pathMatch:'full' указывает, что запрошенный адрес должен полностью соответствовать маршруту, то есть должно быть полное соответствие. Например, запрос /contact полностью соотвествует маршруту { path: 'contact', redirectTo: '/about', pathMatch:'full'}, поэтому будет выполняться переадресация на адрес /about.
А запрос /contact/5 не будет соответствовать этому маршруту, так как после contact идут другие сегменты.



