Angular Routing: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 29: Line 29:
==Identifying where to place the route templates==
==Identifying where to place the route templates==
This is via the router-outlet in the component.
This is via the router-outlet in the component.
<syntaxhighlight lang="html">
<syntaxhighlight lang="ts">
@Component({
@Component({
   selector: 'pm-root',
   selector: 'pm-root',
Line 45: Line 45:


</syntaxhighlight>
</syntaxhighlight>
=Creating a Guard=
=Creating a Guard=
==Example Guard==
==Example Guard==
This guard protects the user from navigating away for the form is there has been data entered.
This guard protects the user from navigating away for the form is there has been data entered.
<syntaxhighlight lang="html">
<syntaxhighlight lang="ts">
import { Injectable } from '@angular/core';
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { CanDeactivate } from '@angular/router';

Latest revision as of 13:41, 7 September 2020

Introduction

Setting up Routing requires three steps

  • Configuring the routes
  • Activating the routes
  • Identifying where to place the route templates

Configuring the routes

We define a path, a component and optionally a guards which provides permissions

    RouterModule.forChild([
      { path: 'products', component: ProductListComponent },
      { path: 'products/:id', component: ProductDetailComponent },
      {
        path: 'products/:id/edit',
        canDeactivate: [ProductEditGuard],
        component: ProductEditComponent
      }
    ])

Activating the routes

This is done via the routeLink for example

        <li class='nav-item'><a class='nav-link' routerLinkActive='active'
              [routerLink]="['/welcome']">Home</a>
        </li>

Identifying where to place the route templates

This is via the router-outlet in the component.

@Component({
  selector: 'pm-root',
  template: `
...
    <div class='container'>
      <router-outlet></router-outlet>
    </div>
    `,
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  pageTitle = 'Acme Product Management';
}

Creating a Guard

Example Guard

This guard protects the user from navigating away for the form is there has been data entered.

import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { Observable } from 'rxjs';

import { ProductEditComponent } from './product-edit.component';

@Injectable({
  providedIn: 'root'
})
export class ProductEditGuard implements CanDeactivate<ProductEditComponent> {
  canDeactivate(component: ProductEditComponent): Observable<boolean> | Promise<boolean> | boolean {
    if (component.productForm.dirty) {
      const productName = component.productForm.get('productName').value || 'New Product';
      return confirm(`Navigate away and lose all changes to ${productName}?`);
    }
    return true;
  }
}