Spec-Zone.ru › Angular

Навигация по маршрутам

Директива RouterLink — это декларативный подход Angular к навигации. Она позволяет использовать стандартные элементы ссылок (<a>), которые бесшовно интегрируются с системой маршрутизации Angular.

Как использовать RouterLink

Вместо обычных элементов ссылок <a> с атрибутом href добавьте директиву RouterLink с соответствующим путём, чтобы использовать маршрутизацию Angular.

import {RouterLink} from '@angular/router';

@Component({
  template: `
    <nav>
      <a routerLink="/user-profile">User profile</a>
      <a routerLink="/settings">Settings</a>
    </nav>
  `,
  imports: [RouterLink],
  ...
})
export class App {}

Использование абсолютных или относительных ссылок

Относительные URL-адреса в маршрутизации Angular позволяют задавать пути навигации относительно расположения текущего маршрута. Это отличается от абсолютных URL-адресов, которые содержат полный путь с протоколом (например, http://) и корневым доменом (например, google.com).

<!-- Absolute URL -->
<a href="https://www.angular.dev/essentials">Angular Essentials Guide</a>

<!-- Relative URL -->
<a href="/essentials">Angular Essentials Guide</a>

В этом примере первый вариант содержит полный путь с протоколом (то есть https://) и корневым доменом (то есть angular.dev), явно заданными для страницы essentials. В отличие от него, второй вариант предполагает, что пользователь уже находится в правильном корневом домене для /essentials.

Как правило, предпочтительнее использовать относительные URL-адреса: их проще сопровождать в разных приложениях, поскольку им не нужно знать своё абсолютное положение в иерархии маршрутизации.

Как работают относительные URL-адреса

В маршрутизации Angular есть два способа задать относительные URL-адреса: строки и массивы.

<!-- Navigates user to /dashboard -->
<a routerLink="dashboard">Dashboard</a>
<a [routerLink]="['dashboard']">Dashboard</a>

ПОЛЕЗНО: Строка — наиболее распространённый способ задания относительных URL-адресов.

Если в относительном URL-адресе нужно задать динамические параметры, используйте синтаксис массива:

<a [routerLink]="['user', currentUserId]">Current User</a>

Кроме того, в маршрутизации Angular можно указать, должен ли путь отсчитываться от текущего URL-адреса или от корневого домена. Это определяется наличием косой черты (/) в начале относительного пути.

Например, если пользователь находится на example.com/settings, относительные пути для разных сценариев можно задать следующим образом:

<!-- Navigates to /settings/notifications -->
<a routerLink="notifications">Notifications</a>
<a routerLink="/settings/notifications">Notifications</a>

<!-- Navigates to /team/:teamId/user/:userId -->
<a routerLink="/team/123/user/456">User 456</a>
<a [routerLink]="['/team', teamId, 'user', userId]">Current User</a>

Программная навигация по маршрутам

В то время как RouterLink обеспечивает декларативную навигацию в шаблонах, Angular также предоставляет программную навигацию для ситуаций, когда переход требуется выполнить на основе логики, действий пользователя или состояния приложения. Внедрив Router, вы сможете динамически переходить к маршрутам, передавать параметры и управлять поведением навигации в коде TypeScript.

router.navigate()

Для программного перехода между маршрутами можно использовать метод router.navigate(), указав массив путей URL.

import {Router} from '@angular/router';

@Component({
  selector: 'app-dashboard',
  template: ` <button (click)="navigateToProfile()">View Profile</button> `,
})
export class AppDashboard {
  private router = inject(Router);

  navigateToProfile() {
    // Standard navigation
    this.router.navigate(['/profile']);

    // With route parameters
    this.router.navigate(['/users', userId]);

    // With query parameters
    this.router.navigate(['/search'], {
      queryParams: {category: 'books', sort: 'price'},
    });

    // With matrix parameters
    this.router.navigate(['/products', {featured: true, onSale: true}]);
  }
}

router.navigate() поддерживает как простые, так и сложные сценарии маршрутизации, позволяя передавать параметры маршрута, параметры запроса и управлять поведением навигации.

Также можно создавать динамические пути навигации относительно расположения компонента в дереве маршрутизации с помощью параметра relativeTo.

import {Router, ActivatedRoute} from '@angular/router';

@Component({
  selector: 'app-user-detail',
  template: `
    <button (click)="navigateToEdit()">Edit User</button>
    <button (click)="navigateToParent()">Back to List</button>
  `,
})
export class UserDetail {
  private route = inject(ActivatedRoute);
  private router = inject(Router);

  // Navigate to a sibling route
  navigateToEdit() {
    // From: /users/123
    // To:   /users/123/edit
    this.router.navigate(['edit'], {relativeTo: this.route});
  }

  // Navigate to parent
  navigateToParent() {
    // From: /users/123
    // To:   /users
    this.router.navigate(['..'], {relativeTo: this.route});
  }

  navigateToList() {
    // Angular resolves the commands array as a single navigation path relative to the current route.
    // From: /users/123
    // Result: /users/list
    this.router.navigate(['..', 'list'], {relativeTo: this.route});
  }
}

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

// From: /team/123/users/456
// Result: /team/123/settings
this.router.navigate(['../../settings'], {relativeTo: this.route});

При использовании relativeTo не добавляйте / в начало первой команды. Начальная / делает навигацию абсолютной, полностью игнорируя relativeTo.

// From: /team/123/users/456
// Result: /team/123/users/456/edit
this.router.navigate(['edit'], {relativeTo: this.route});
// From: /team/123/users/456
// Leading '/' causes absolute navigation — relativeTo is ignored
// Result: /edit
this.router.navigate(['/edit'], {relativeTo: this.route});

router.navigateByUrl()

Метод router.navigateByUrl() позволяет выполнять программную навигацию напрямую, используя строки путей URL вместо сегментов массива. Этот метод удобен, когда у вас есть полный путь URL и требуется выполнить абсолютную навигацию, особенно при работе с URL-адресами, полученными извне, или в сценариях глубокого связывания.

// Standard route navigation
router.navigateByUrl('/products');

// Navigate to nested route
router.navigateByUrl('/products/featured');

// Complete URL with parameters and fragment
router.navigateByUrl('/products/123?view=details#reviews');

// Navigate with query parameters
router.navigateByUrl('/search?category=books&sortBy=price');

// With matrix parameters
router.navigateByUrl('/sales-awesome;isOffer=true;showModal=false');

Если нужно заменить текущий URL-адрес в истории браузера, метод navigateByUrl также принимает объект конфигурации с параметром replaceUrl.

// Replace current URL in history
router.navigateByUrl('/checkout', {
  replaceUrl: true,
});

Отображение другого URL-адреса в адресной строке

Можно передать параметр browserUrl в navigateByUrl, чтобы в адресной строке браузера отображался URL-адрес, отличный от используемого для сопоставления маршрута.

Это полезно, если нужно перенаправить пользователя на другой маршрут — например, на страницу ошибки, — не меняя URL-адрес, который пользователь изначально пытался открыть.

router.navigateByUrl('/not-found', {browserUrl: '/products/missing-item'});

Angular переходит на маршрут /not-found и отображает его, но в адресной строке браузера показывается /products/missing-item.

ПРИМЕЧАНИЕ: browserUrl влияет только на то, что отображается в адресной строке браузера.

Настройка URL-адреса браузера с помощью RouterLink

Директива RouterLink также поддерживает входной параметр browserUrl, позволяющий управлять URL-адресом, отображаемым в адресной строке браузера при нажатии ссылки, независимо от маршрута, на который переходит Angular.

<!-- Navigates to /dashboard, but the address bar shows /home -->
<a [routerLink]="['/dashboard']" [browserUrl]="'/home'">Go to Dashboard</a>

Для более динамичных сценариев можно также привязать UrlTree:

import {Component, inject} from '@angular/core';
import {Router, RouterLink, UrlTree} from '@angular/router';

@Component({
  template: `
    <a [routerLink]="['/products', product.id]" [browserUrl]="displayUrl">
      {{ product.name }}
    </a>
  `,
  imports: [RouterLink],
})
export class ProductList {
  private router = inject(Router);

  product = {id: 42, name: 'Widget'};

  // Create a UrlTree to display in the address bar
  displayUrl: UrlTree = this.router.createUrlTree(['/products', 'widget']);
}

Дальнейшие шаги

Узнайте, как читать состояние маршрута, чтобы создавать отзывчивые компоненты, учитывающие контекст.

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/routing/navigate-to-routes

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API