UK - 06 - Angular Routing PDF
UK - 06 - Angular Routing PDF
Module - Routing
Peter Kassenaar –
[email protected]
Routing architecture and goal
index.html
Home Producten
/producten
/ /about
Contact
/contact Over
Ons
2. <div ng-view></div>
4
Routing – every route is a Component
HomeComponent
<router-outlet></router-outlet>
6
main.ts / bootstrapper Services,
components, etc
Router
ngModule / root module Module
MainComponent app.routes.ts
<base href="/">
• There can be multiple routes per module. Each component
can configure its own ChildRoutes – to be discussed.
// app.routes.ts
import {Routes} from '@angular/router';
import {AppComponent} from "./app.component";
import {CityAddComponent} from "./city.add.component";
@Component({ “Hoofdmenu”.
selector: ’main-component', Notice routerLink
template: `
<h1>Pick your favorite city</h1>
<!-- Static 'main menu'. Always visible-->
<!-- Add routerLink directive. Angular replaces this with correct <a href="..."> -->
<a routerLink="/home" class="btn btn-primary">List of cities</a>
<a routerLink="/add" class="btn btn-primary">Add City</a>
<hr>
<!-- Dynamically inject views here -->
<router-outlet></router-outlet>
<!-- Static footer here. Always visible-->
`
}) <router-outlet>
export class MainComponent implements OnInit {
constructor() { }
ngOnInit() { }
}
Empty Component
11
5. Edit index.html
<div class="container">
<main-component>
Loading...
</main-component>
</div>
12
6. Create new components and import
// city.add.component.ts
import { Component } from ‘@angular/core';
@Component({ // city.edit.component.ts
import { Component } from ‘@angular/core';
selector: 'add-city',
template: `<h1>Add City</h1> …` // city.detail.component.ts
}) @Component({ import { Component } from ‘@angular/core';
selector: 'edit-city',
template: `<h1>Edit@Component({
export class CityAddComponent{ City</h1> …`
… }) selector: 'detail-city',
} template: `<h1>Detail City</h1> …`
})
export class CityEditComponent{
…
} export class CityDetailComponent{
…
}
13
7. Run the application
14
Catch-all routes
15
Checkpoint
• Example: /400-routing
• Official docs:
https://angular.io/guide/router
16
Routeparameters
Master-Detail views and –applications
17
Dynamische routes maken
• Method:
1. Edit app.routes.ts and hyperlinks on the page.
18
1. Edit app.routes.ts
// app.routes.ts
import {Routes} from '@angular/router';
import {AppComponent} from "./app.component";
import {CityAddComponent} from "./city.add.component";
import {CityDetailComponent} from "./city.detail.component";
19
2. Create Detail Component
// city.detail.component.ts
…
// import {RouteParams} from "@angular/router"; // OLD way
import {ActivatedRoute} from '@angular/router';
@Component({
selector: 'city-detail',
ActivatedRoute
template: `<h1>City Detail</h1>
<h2>Details voor city: {{ id }}</h2>
`
})
ngOnInit() {
this.route.params
.subscribe((id: any) => {
this.id = id;
});
}
}
2a. DetailComponent - variants
ngOnInit() {
// NEW:
this.sub = this.route.params
.subscribe((params: any) => {
this.id = params['id'];
this.name = params['name'];
});
}
.unsubscribe()
ngOnDestroy() {
// If subscribed, we must unsubscribe before Angular destroys the component.
// Failure to do so could create a memory leak.
this.sub.unsubscribe();
}
3. Add Detail component to Module
// app.module.ts
…
// Components
import {CityDetailComponent} from './city.detail.component';
@NgModule({
imports : [
…
],
Component
declarations: [
…
CityDetailComponent
],
providers : [CityService],
bootstrap : [MainComponent]
})
export class AppModule {
}
Edit App Component (‘Master View’)
24
Meegeven van parameters
25
Optional parameters : [queryParams]
HTML
Class
26
Next up – details via Service
27
In city.service.ts:
28
Checkpoint
• Example: \401-route-parameter
• Exercise 7c)
Exercise….
29
More on routing
• Child Routes
• Router resolvers
§ https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html
30
Route Guards
Secure parts of you application with Guards
31
Guard Types
Credits: http://blog.thoughtram.io/angular/2016/07/18/guards-in-angular-2.html
Defining Guards
§ Promise<boolean> or
§ boolean.
33
Guards as a function
// app.module.ts
…
@NgModule({
…
providers : [ Token
CityService,
{ Function
provide : 'CanAlwaysActivateGuard',
useValue: () => {
console.log("Route requested");
return true; // do validation or other stuff here
}
}
],
…
})
export class AppModule {}
Use the guard token in app.routes
// app.routes.ts
…
export const AppRoutes: Routes = [
…
{
path: 'home',
component: AppComponent,
canActivate: ['CanAlwaysActivateGuard'] // Defined in app.module.ts
},
…
];
(re)use of string
token
§ canActivate()
§ canActivateChild()
§ canDeActivate()
36
canActivateViaAuthGuard.ts
// canActivateViaAuthGuard.ts
import { Injectable } from '@angular/core'; Class/Guard name
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
Auth Service
@Injectable()
export class CanActivateViaAuthGuard implements CanActivate {
canActivate() {
return this.authService.isLoggedIn(); Interface
implementation
}
}
37
Register Guard class on module and routes
// app.module.ts
…
@NgModule({
// app.routes.ts
… …
providers : [ import {CanActivateViaAuthGuard} from "./canActivateVi
// canDeactivateGuard.ts
import {Injectable} from '@angular/core';
import {CanDeactivate} from '@angular/router';
import {CanDeactivateComponent} from "./canDeactivate.component";
@Injectable()
export class CanDeactivateGuard implements CanDeactivate<CanDeactivateComponent> {
canDeactivate(target:CanDeactivateComponent) {
// Can the user deactivate the route? Test for changes here!
// For now, return Yes|Nope from the browser confirm dialog.
if (target.hasChanges()) {
return window.confirm('Do you really want to cancel? There might be unsaved changes.'
}
return true;
}
}
Add guard to routes
// app.routes.ts
…
import {CanDeactivateComponent} from "./canDeactivate.component";
import {CanDeactivateGuard} from "./canDeactivateGuard";
// …
export class CanDeactivateComponent implements OnInit {
// Properties voor de component/class
myForm:FormGroup = new FormGroup({
txtInput:new FormControl()
});
moveAway() {
this.route.navigate(['/home']);
}
hasChanges(){
return this.myForm.dirty; // return state of the form
}
}
41
More info
More background information on routing
42
More on routing
• https://angular.io/docs/ts/latest/guide/router.html
• http://blog.thoughtram.io/angular/2016/06/14/routing-in-angular-2-
revisited.html
• http://blog.thoughtram.io/angular/2016/07/18/guards-in-angular-
2.html
• https://vsavkin.com/
• https://angular-2-training-
book.rangle.io/handout/routing/child_routes.html
43
Victor Savkin (=creator of the router)
https://leanpub.com/router
https://www.youtube.com/watch?v=QLns6s02O48
Advanced routing
https://angular.io/docs/ts/latest/guide/router.html
46
Victor Savkin on Routing
https://vsavkin.com/
47