From bc91b35bd98f148f595feb49b623df48dab6ea08 Mon Sep 17 00:00:00 2001 From: Ward Bell Date: Wed, 21 Dec 2016 12:08:39 -0800 Subject: [PATCH] docs(router): heavy copy edits (#3021) --- public/docs/_examples/router/e2e-spec.ts | 6 +- .../ts/app/admin/admin-dashboard.component.ts | 5 +- .../ts/app/admin/admin-routing.module.ts | 1 - .../router/ts/app/admin/admin.module.ts | 4 - .../_examples/router/ts/app/animations.ts | 26 + .../router/ts/app/app-routing.module.1.ts | 16 +- .../router/ts/app/app-routing.module.2.ts | 10 +- .../router/ts/app/app-routing.module.3.ts | 14 +- .../router/ts/app/app-routing.module.4.ts | 16 +- .../router/ts/app/app-routing.module.5.ts | 18 +- .../router/ts/app/app-routing.module.6.ts | 12 +- .../router/ts/app/app-routing.module.ts | 23 +- .../router/ts/app/app.component.2.ts | 3 +- .../router/ts/app/app.component.3.ts | 3 +- .../router/ts/app/app.component.4.ts | 15 +- .../router/ts/app/app.component.5.ts | 20 + .../_examples/router/ts/app/app.component.ts | 4 +- .../_examples/router/ts/app/app.module.0.ts | 48 +- .../_examples/router/ts/app/app.module.1.ts | 17 +- .../_examples/router/ts/app/app.module.2.ts | 9 +- .../_examples/router/ts/app/app.module.3.ts | 18 +- .../_examples/router/ts/app/app.module.4.ts | 7 +- .../_examples/router/ts/app/app.module.5.ts | 9 +- .../_examples/router/ts/app/app.module.6.ts | 9 +- .../_examples/router/ts/app/app.module.7.ts | 13 +- .../_examples/router/ts/app/app.module.ts | 23 +- .../router/ts/app/auth-guard.service.ts | 4 +- .../ts/app/compose-message.component.1.ts | 108 - .../ts/app/compose-message.component.html | 17 + .../ts/app/compose-message.component.ts | 107 +- .../crisis-center-routing.module.2.ts | 12 +- .../crisis-center-routing.module.4.ts | 13 +- .../crisis-center-routing.module.ts | 10 +- .../app/crisis-center/crisis-center.module.ts | 2 +- ...e.ts => crisis-detail-resolver.service.ts} | 2 +- .../crisis-detail.component.1.ts | 56 +- .../crisis-center/crisis-detail.component.ts | 60 +- .../crisis-center/crisis-list.component.1.ts | 34 +- .../crisis-center/crisis-list.component.ts | 14 +- .../router/ts/app/hero-list.component.ts | 2 +- .../ts/app/heroes/hero-detail.component.ts | 60 +- .../ts/app/heroes/hero-list.component.1.ts | 2 +- .../ts/app/heroes/hero-list.component.ts | 2 +- .../router/ts/app/not-found.component.ts | 4 +- ...gy.ts => selective-preloading-strategy.ts} | 4 +- public/docs/_examples/router/ts/index.1.html | 33 - public/docs/_examples/router/ts/index.html | 2 + public/docs/_examples/router/ts/plnkr.json | 4 +- public/docs/ts/latest/guide/change-log.jade | 4 + public/docs/ts/latest/guide/router.jade | 2122 +++++++++-------- .../images/devguide/router/complete-nav.png | Bin 42130 -> 0 bytes .../images/devguide/router/contact-popup.png | Bin 0 -> 3996 bytes .../devguide/router/crisis-center-detail.png | Bin 11253 -> 14332 bytes .../devguide/router/crisis-center-list.png | Bin 14980 -> 11488 bytes .../images/devguide/router/hero-detail.png | Bin 7145 -> 5531 bytes .../images/devguide/router/hero-list.png | Bin 11956 -> 8001 bytes .../images/devguide/router/router-anim.gif | Bin 233557 -> 0 bytes 57 files changed, 1421 insertions(+), 1606 deletions(-) create mode 100644 public/docs/_examples/router/ts/app/animations.ts create mode 100644 public/docs/_examples/router/ts/app/app.component.5.ts delete mode 100644 public/docs/_examples/router/ts/app/compose-message.component.1.ts create mode 100644 public/docs/_examples/router/ts/app/compose-message.component.html rename public/docs/_examples/router/ts/app/crisis-center/{crisis-detail-resolve.service.ts => crisis-detail-resolver.service.ts} (91%) rename public/docs/_examples/router/ts/app/{selective-preload-strategy.ts => selective-preloading-strategy.ts} (79%) delete mode 100644 public/docs/_examples/router/ts/index.1.html delete mode 100644 public/resources/images/devguide/router/complete-nav.png create mode 100644 public/resources/images/devguide/router/contact-popup.png delete mode 100644 public/resources/images/devguide/router/router-anim.gif diff --git a/public/docs/_examples/router/e2e-spec.ts b/public/docs/_examples/router/e2e-spec.ts index 00a9d2d924..ed93fa20d7 100644 --- a/public/docs/_examples/router/e2e-spec.ts +++ b/public/docs/_examples/router/e2e-spec.ts @@ -28,13 +28,13 @@ describe('Router', function () { adminHref: hrefEles.get(2), adminPreloadList: element.all(by.css('my-app > ng-component > ng-component > ul > li')), - + loginHref: hrefEles.get(3), loginButton: element.all(by.css('my-app > ng-component > p > button')), - + contactHref: hrefEles.get(4), contactCancelButton: element.all(by.buttonText('Cancel')), - + outletComponents: element.all(by.css('my-app > ng-component')) }; } diff --git a/public/docs/_examples/router/ts/app/admin/admin-dashboard.component.ts b/public/docs/_examples/router/ts/app/admin/admin-dashboard.component.ts index 02574829c0..b3fc839616 100644 --- a/public/docs/_examples/router/ts/app/admin/admin-dashboard.component.ts +++ b/public/docs/_examples/router/ts/app/admin/admin-dashboard.component.ts @@ -2,7 +2,8 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { PreloadSelectedModules } from '../selective-preload-strategy'; + +import { SelectivePreloadingStrategy } from '../selective-preloading-strategy'; import 'rxjs/add/operator/map'; @@ -27,7 +28,7 @@ export class AdminDashboardComponent implements OnInit { constructor( private route: ActivatedRoute, - private preloadStrategy: PreloadSelectedModules + private preloadStrategy: SelectivePreloadingStrategy ) { this.modules = preloadStrategy.preloadedModules; } diff --git a/public/docs/_examples/router/ts/app/admin/admin-routing.module.ts b/public/docs/_examples/router/ts/app/admin/admin-routing.module.ts index a6ab988005..2b1048d110 100644 --- a/public/docs/_examples/router/ts/app/admin/admin-routing.module.ts +++ b/public/docs/_examples/router/ts/app/admin/admin-routing.module.ts @@ -8,7 +8,6 @@ import { AdminDashboardComponent } from './admin-dashboard.component'; import { ManageCrisesComponent } from './manage-crises.component'; import { ManageHeroesComponent } from './manage-heroes.component'; -// #docregion admin-route import { AuthGuard } from '../auth-guard.service'; const adminRoutes: Routes = [ diff --git a/public/docs/_examples/router/ts/app/admin/admin.module.ts b/public/docs/_examples/router/ts/app/admin/admin.module.ts index eb4cfdb0da..2736f00e1d 100644 --- a/public/docs/_examples/router/ts/app/admin/admin.module.ts +++ b/public/docs/_examples/router/ts/app/admin/admin.module.ts @@ -1,4 +1,3 @@ -// #docplaster // #docregion import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; @@ -22,7 +21,4 @@ import { AdminRoutingModule } from './admin-routing.module'; ManageHeroesComponent ] }) -// #docregion admin-module-export export class AdminModule {} -// #enddocregion admin-module-export -// #enddocregion diff --git a/public/docs/_examples/router/ts/app/animations.ts b/public/docs/_examples/router/ts/app/animations.ts new file mode 100644 index 0000000000..776690cb78 --- /dev/null +++ b/public/docs/_examples/router/ts/app/animations.ts @@ -0,0 +1,26 @@ +// #docregion +import { animate, AnimationEntryMetadata, state, style, transition, trigger } from '@angular/core'; + +// Component transition animations +export const slideInDownAnimation: AnimationEntryMetadata = + trigger('routeAnimation', [ + state('*', + style({ + opacity: 1, + transform: 'translateX(0)' + }) + ), + transition(':enter', [ + style({ + opacity: 0, + transform: 'translateX(-100%)' + }), + animate('0.2s ease-in') + ]), + transition(':leave', [ + animate('0.5s ease-out', style({ + opacity: 0, + transform: 'translateY(100%)' + })) + ]) + ]); diff --git a/public/docs/_examples/router/ts/app/app-routing.module.1.ts b/public/docs/_examples/router/ts/app/app-routing.module.1.ts index b8fb83f0eb..8146e54671 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.1.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.1.ts @@ -1,17 +1,19 @@ -// #docplaster // #docregion -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; -import { CrisisListComponent } from './crisis-list.component'; -import { HeroListComponent } from './hero-list.component'; -import { PageNotFoundComponent }from './not-found.component'; +import { CrisisListComponent } from './crisis-list.component'; +import { HeroListComponent } from './hero-list.component'; +import { PageNotFoundComponent } from './not-found.component'; +// #docregion appRoutes const appRoutes: Routes = [ { path: 'crisis-center', component: CrisisListComponent }, - { path: 'heroes', component: HeroListComponent }, + { path: 'heroes', component: HeroListComponent }, + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, { path: '**', component: PageNotFoundComponent } ]; +// #enddocregion appRoutes @NgModule({ imports: [ diff --git a/public/docs/_examples/router/ts/app/app-routing.module.2.ts b/public/docs/_examples/router/ts/app/app-routing.module.2.ts index d2e6fd8943..d9a8fcaebb 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.2.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.2.ts @@ -1,13 +1,15 @@ // #docplaster // #docregion -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +// #docregion v2 +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; -import { CrisisListComponent } from './crisis-list.component'; -import { PageNotFoundComponent }from './not-found.component'; +import { CrisisListComponent } from './crisis-list.component'; +import { PageNotFoundComponent } from './not-found.component'; const appRoutes: Routes = [ { path: 'crisis-center', component: CrisisListComponent }, + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, { path: '**', component: PageNotFoundComponent } ]; diff --git a/public/docs/_examples/router/ts/app/app-routing.module.3.ts b/public/docs/_examples/router/ts/app/app-routing.module.3.ts index 431d7ee32a..538ff9aafc 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.3.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.3.ts @@ -1,17 +1,23 @@ // #docplaster // #docregion , v3 -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + import { ComposeMessageComponent } from './compose-message.component'; +import { PageNotFoundComponent } from './not-found.component'; const appRoutes: Routes = [ // #enddocregion v3 +// #docregion compose { path: 'compose', component: ComposeMessageComponent, - outlet: 'modal' - } + outlet: 'popup' + }, +// #enddocregion compose // #docregion v3 + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, + { path: '**', component: PageNotFoundComponent } ]; @NgModule({ diff --git a/public/docs/_examples/router/ts/app/app-routing.module.4.ts b/public/docs/_examples/router/ts/app/app-routing.module.4.ts index a2a3ecb8c5..6835d24a85 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.4.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.4.ts @@ -1,17 +1,19 @@ // #docregion -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { PageNotFoundComponent }from './not-found.component'; +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; -import { ComposeMessageComponent } from './compose-message.component'; -import { CanDeactivateGuard } from './can-deactivate-guard.service'; +import { ComposeMessageComponent } from './compose-message.component'; +import { CanDeactivateGuard } from './can-deactivate-guard.service'; +import { PageNotFoundComponent } from './not-found.component'; const appRoutes: Routes = [ { path: 'compose', component: ComposeMessageComponent, - outlet: 'modal' - } + outlet: 'popup' + }, + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, + { path: '**', component: PageNotFoundComponent } ]; @NgModule({ diff --git a/public/docs/_examples/router/ts/app/app-routing.module.5.ts b/public/docs/_examples/router/ts/app/app-routing.module.5.ts index 30b808f051..2badf7f593 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.5.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.5.ts @@ -6,26 +6,28 @@ import { RouterModule, Routes } from '@angular/router'; // #enddocregion import-router import { ComposeMessageComponent } from './compose-message.component'; -import { CanDeactivateGuard } from './can-deactivate-guard.service'; -// #docregion can-load-guard -import { AuthGuard } from './auth-guard.service'; -// #enddocregion can-load-guard +import { PageNotFoundComponent } from './not-found.component'; + +import { CanDeactivateGuard } from './can-deactivate-guard.service'; +import { AuthGuard } from './auth-guard.service'; -// #docregion lazy-load-admin, can-load-guard const appRoutes: Routes = [ { path: 'compose', component: ComposeMessageComponent, - outlet: 'modal' + outlet: 'popup' }, +// #docregion admin, admin-1 { path: 'admin', loadChildren: 'app/admin/admin.module#AdminModule', -// #enddocregion lazy-load-admin +// #enddocregion admin-1 canLoad: [AuthGuard] -// #docregion lazy-load-admin +// #docregion admin-1 }, +// #enddocregion admin, admin-1 + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, { path: '**', component: PageNotFoundComponent } ]; diff --git a/public/docs/_examples/router/ts/app/app-routing.module.6.ts b/public/docs/_examples/router/ts/app/app-routing.module.6.ts index 3fb6cc4e85..df2c8c097d 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.6.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.6.ts @@ -9,6 +9,8 @@ import { } from '@angular/router'; import { ComposeMessageComponent } from './compose-message.component'; +import { PageNotFoundComponent } from './not-found.component'; + import { CanDeactivateGuard } from './can-deactivate-guard.service'; import { AuthGuard } from './auth-guard.service'; @@ -16,33 +18,31 @@ const appRoutes: Routes = [ { path: 'compose', component: ComposeMessageComponent, - outlet: 'modal' + outlet: 'popup' }, { path: 'admin', loadChildren: 'app/admin/admin.module#AdminModule', canLoad: [AuthGuard] }, - { - path: '', - redirectTo: '/heroes', - pathMatch: 'full' - }, { path: 'crisis-center', loadChildren: 'app/crisis-center/crisis-center.module#CrisisCenterModule' }, + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, { path: '**', component: PageNotFoundComponent } ]; @NgModule({ imports: [ + // #docregion forRoot RouterModule.forRoot( appRoutes // #enddocregion preload-v1 , { preloadingStrategy: PreloadAllModules } // #docregion preload-v1 ) + // #enddocregion forRoot ], exports: [ RouterModule diff --git a/public/docs/_examples/router/ts/app/app-routing.module.ts b/public/docs/_examples/router/ts/app/app-routing.module.ts index f4588738aa..0748006655 100644 --- a/public/docs/_examples/router/ts/app/app-routing.module.ts +++ b/public/docs/_examples/router/ts/app/app-routing.module.ts @@ -4,42 +4,39 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { ComposeMessageComponent } from './compose-message.component'; +import { PageNotFoundComponent } from './not-found.component'; + import { CanDeactivateGuard } from './can-deactivate-guard.service'; import { AuthGuard } from './auth-guard.service'; -import { PreloadSelectedModules } from './selective-preload-strategy'; +import { SelectivePreloadingStrategy } from './selective-preloading-strategy'; const appRoutes: Routes = [ { path: 'compose', component: ComposeMessageComponent, - outlet: 'modal' + outlet: 'popup' }, { path: 'admin', loadChildren: 'app/admin/admin.module#AdminModule', canLoad: [AuthGuard] }, - { - path: '', - redirectTo: '/heroes', - pathMatch: 'full' - }, // #docregion preload-v2 { path: 'crisis-center', loadChildren: 'app/crisis-center/crisis-center.module#CrisisCenterModule', - data: { - preload: true - } - } + data: { preload: true } + }, // #enddocregion preload-v2 + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, + { path: '**', component: PageNotFoundComponent } ]; @NgModule({ imports: [ RouterModule.forRoot( appRoutes, - { preloadingStrategy: PreloadSelectedModules } + { preloadingStrategy: SelectivePreloadingStrategy } ) ], exports: [ @@ -47,7 +44,7 @@ const appRoutes: Routes = [ ], providers: [ CanDeactivateGuard, - PreloadSelectedModules + SelectivePreloadingStrategy ] }) export class AppRoutingModule {} diff --git a/public/docs/_examples/router/ts/app/app.component.2.ts b/public/docs/_examples/router/ts/app/app.component.2.ts index fa3ddf01b9..fa3dfd11cf 100644 --- a/public/docs/_examples/router/ts/app/app.component.2.ts +++ b/public/docs/_examples/router/ts/app/app.component.2.ts @@ -15,5 +15,4 @@ import { Component } from '@angular/core'; ` }) -export class AppComponent { -} +export class AppComponent { } diff --git a/public/docs/_examples/router/ts/app/app.component.3.ts b/public/docs/_examples/router/ts/app/app.component.3.ts index ad4dbe33d6..7067e42cf2 100644 --- a/public/docs/_examples/router/ts/app/app.component.3.ts +++ b/public/docs/_examples/router/ts/app/app.component.3.ts @@ -46,5 +46,4 @@ import { Router } from '@angular/router'; ` // #enddocregion template }) -export class AppComponent { -} +export class AppComponent { } diff --git a/public/docs/_examples/router/ts/app/app.component.4.ts b/public/docs/_examples/router/ts/app/app.component.4.ts index d6352ea508..8d0e706e51 100644 --- a/public/docs/_examples/router/ts/app/app.component.4.ts +++ b/public/docs/_examples/router/ts/app/app.component.4.ts @@ -9,14 +9,15 @@ import { Component } from '@angular/core'; + // #docregion outlets - // #enddocregion template - - // #enddocregion template - ` + + // #enddocregion outlets + ` // #enddocregion template }) -export class AppComponent { -} +export class AppComponent { } diff --git a/public/docs/_examples/router/ts/app/app.component.5.ts b/public/docs/_examples/router/ts/app/app.component.5.ts new file mode 100644 index 0000000000..a36c131a45 --- /dev/null +++ b/public/docs/_examples/router/ts/app/app.component.5.ts @@ -0,0 +1,20 @@ +// #docregion +import { Component } from '@angular/core'; + +@Component({ + selector: 'my-app', + // #docregion template + template: ` +

Angular Router

+ + + + ` + // #enddocregion template +}) +export class AppComponent { } diff --git a/public/docs/_examples/router/ts/app/app.component.ts b/public/docs/_examples/router/ts/app/app.component.ts index 142576a7e3..a479680cbe 100644 --- a/public/docs/_examples/router/ts/app/app.component.ts +++ b/public/docs/_examples/router/ts/app/app.component.ts @@ -12,10 +12,10 @@ import { Component } from '@angular/core'; Heroes Admin Login - Contact + Contact - + ` // #enddocregion template }) diff --git a/public/docs/_examples/router/ts/app/app.module.0.ts b/public/docs/_examples/router/ts/app/app.module.0.ts index 9844f30586..a195dbdd7a 100644 --- a/public/docs/_examples/router/ts/app/app.module.0.ts +++ b/public/docs/_examples/router/ts/app/app.module.0.ts @@ -1,53 +1,41 @@ +// NEVER USED. For docs only. Should compile though // #docplaster -// #docregion -// #docregion router-basics import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; import { RouterModule, Routes } from '@angular/router'; -import { AppComponent } from './app.component'; import { HeroListComponent } from './hero-list.component'; import { CrisisListComponent } from './crisis-list.component'; import { PageNotFoundComponent } from './not-found.component'; import { PageNotFoundComponent as HeroDetailComponent } from './not-found.component'; -import { PageNotFoundComponent as HomeComponent } from './not-found.component'; -// #docregion route-config +// #docregion const appRoutes: Routes = [ - // #docregion route-defs - // #docregion hero-detail-route - { path: 'hero/:id', component: HeroDetailComponent }, - // #enddocregion hero-detail-route { path: 'crisis-center', component: CrisisListComponent }, + { path: 'hero/:id', component: HeroDetailComponent }, { path: 'heroes', component: HeroListComponent, - data: { - title: 'Heroes List' - } + data: { title: 'Heroes List' } + }, + { path: '', + redirectTo: '/heroes', + pathMatch: 'full' }, - { path: '', component: HomeComponent }, - // #enddocregion route-defs { path: '**', component: PageNotFoundComponent } ]; @NgModule({ imports: [ - BrowserModule, - FormsModule, RouterModule.forRoot(appRoutes) + // other imports here ], - declarations: [ - AppComponent, - HeroListComponent, - HeroDetailComponent, - CrisisListComponent, - PageNotFoundComponent - ], - bootstrap: [ AppComponent ] -}) -// #enddocregion router-basics -export class AppModule { -} // #enddocregion +/* +// #docregion + ... +}) +export class AppModule { } +// #enddocregion +*/ +}) +export class AppModule0 { } diff --git a/public/docs/_examples/router/ts/app/app.module.1.ts b/public/docs/_examples/router/ts/app/app.module.1.ts index 8f3126b660..32f93b8f79 100644 --- a/public/docs/_examples/router/ts/app/app.module.1.ts +++ b/public/docs/_examples/router/ts/app/app.module.1.ts @@ -8,20 +8,26 @@ import { FormsModule } from '@angular/forms'; import { RouterModule, Routes } from '@angular/router'; // #enddocregion import-router -import { AppComponent } from './app.component'; -import { CrisisListComponent } from './crisis-list.component'; -import { HeroListComponent } from './hero-list.component'; +import { AppComponent } from './app.component'; +import { CrisisListComponent } from './crisis-list.component'; +import { HeroListComponent } from './hero-list.component'; // #enddocregion first-config -import { PageNotFoundComponent }from './not-found.component'; +import { PageNotFoundComponent } from './not-found.component'; // #docregion first-config +// #docregion appRoutes const appRoutes: Routes = [ { path: 'crisis-center', component: CrisisListComponent }, { path: 'heroes', component: HeroListComponent }, // #enddocregion first-config + + { path: '', redirectTo: '/heroes', pathMatch: 'full' }, +// #docregion wildcard { path: '**', component: PageNotFoundComponent } +// #enddocregion wildcard // #docregion first-config ]; +// #enddocregion appRoutes @NgModule({ imports: [ @@ -39,6 +45,5 @@ const appRoutes: Routes = [ ], bootstrap: [ AppComponent ] }) -export class AppModule { -} +export class AppModule { } // #enddocregion diff --git a/public/docs/_examples/router/ts/app/app.module.2.ts b/public/docs/_examples/router/ts/app/app.module.2.ts index 42e7e51de3..2ba739168c 100644 --- a/public/docs/_examples/router/ts/app/app.module.2.ts +++ b/public/docs/_examples/router/ts/app/app.module.2.ts @@ -8,9 +8,9 @@ import { FormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { AppRoutingModule } from './app-routing.module'; -import { CrisisListComponent } from './crisis-list.component'; -import { HeroListComponent } from './hero-list.component'; -import { PageNotFoundComponent }from './not-found.component'; +import { CrisisListComponent } from './crisis-list.component'; +import { HeroListComponent } from './hero-list.component'; +import { PageNotFoundComponent } from './not-found.component'; @NgModule({ imports: [ @@ -27,6 +27,5 @@ import { PageNotFoundComponent }from './not-found.component'; bootstrap: [ AppComponent ] }) // #enddocregion hero-import -export class AppModule { -} +export class AppModule { } // #enddocregion diff --git a/public/docs/_examples/router/ts/app/app.module.3.ts b/public/docs/_examples/router/ts/app/app.module.3.ts index 36cfeefe0e..08f4579f02 100644 --- a/public/docs/_examples/router/ts/app/app.module.3.ts +++ b/public/docs/_examples/router/ts/app/app.module.3.ts @@ -1,17 +1,14 @@ -// #docplaster // #docregion -// #docregion hero-import import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; -import { AppComponent } from './app.component'; -import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; +import { HeroesModule } from './heroes/heroes.module'; -import { HeroesModule } from './heroes/heroes.module'; - -import { CrisisListComponent } from './crisis-list.component'; -import { PageNotFoundComponent } from './not-found.component'; +import { CrisisListComponent } from './crisis-list.component'; +import { PageNotFoundComponent } from './not-found.component'; @NgModule({ imports: [ @@ -27,7 +24,4 @@ import { PageNotFoundComponent } from './not-found.component'; ], bootstrap: [ AppComponent ] }) -// #enddocregion hero-import -export class AppModule { -} -// #enddocregion +export class AppModule { } diff --git a/public/docs/_examples/router/ts/app/app.module.4.ts b/public/docs/_examples/router/ts/app/app.module.4.ts index 8ae77ac07d..7d927167a7 100644 --- a/public/docs/_examples/router/ts/app/app.module.4.ts +++ b/public/docs/_examples/router/ts/app/app.module.4.ts @@ -7,6 +7,7 @@ import { FormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { PageNotFoundComponent } from './not-found.component'; + import { AppRoutingModule } from './app-routing.module'; import { HeroesModule } from './heroes/heroes.module'; // #docregion crisis-center-module @@ -34,14 +35,14 @@ import { DialogService } from './dialog.service'; declarations: [ AppComponent, // #enddocregion admin-module, crisis-center-module - ComposeMessageComponent + ComposeMessageComponent, // #docregion admin-module, crisis-center-module + PageNotFoundComponent ], providers: [ DialogService ], bootstrap: [ AppComponent ] }) -export class AppModule { -} +export class AppModule { } // #enddocregion diff --git a/public/docs/_examples/router/ts/app/app.module.5.ts b/public/docs/_examples/router/ts/app/app.module.5.ts index d8396c5038..ad34668cea 100644 --- a/public/docs/_examples/router/ts/app/app.module.5.ts +++ b/public/docs/_examples/router/ts/app/app.module.5.ts @@ -9,7 +9,9 @@ import { AppRoutingModule } from './app-routing.module'; import { HeroesModule } from './heroes/heroes.module'; import { CrisisCenterModule } from './crisis-center/crisis-center.module'; + import { ComposeMessageComponent } from './compose-message.component'; +import { PageNotFoundComponent } from './not-found.component'; import { AdminModule } from './admin/admin.module'; import { DialogService } from './dialog.service'; @@ -25,13 +27,12 @@ import { DialogService } from './dialog.service'; ], declarations: [ AppComponent, - ComposeMessageComponent + ComposeMessageComponent, + PageNotFoundComponent ], providers: [ DialogService ], bootstrap: [ AppComponent ] }) -export class AppModule { -} -// #enddocregion +export class AppModule { } diff --git a/public/docs/_examples/router/ts/app/app.module.6.ts b/public/docs/_examples/router/ts/app/app.module.6.ts index b1ba4bd231..4cb0b1fdd5 100644 --- a/public/docs/_examples/router/ts/app/app.module.6.ts +++ b/public/docs/_examples/router/ts/app/app.module.6.ts @@ -4,7 +4,8 @@ import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import { Routes, RouterModule } from '@angular/router'; -import { AppComponent } from './app.component'; +import { AppComponent } from './app.component'; +import { PageNotFoundComponent } from './not-found.component'; const routes: Routes = [ @@ -17,12 +18,12 @@ const routes: Routes = [ RouterModule.forRoot(routes, { useHash: true }) // .../#/crisis-center/ ], declarations: [ - AppComponent + AppComponent, + PageNotFoundComponent ], providers: [ ], bootstrap: [ AppComponent ] }) -export class AppModule { -} +export class AppModule { } diff --git a/public/docs/_examples/router/ts/app/app.module.7.ts b/public/docs/_examples/router/ts/app/app.module.7.ts index ba766758d5..b6ca81ddea 100644 --- a/public/docs/_examples/router/ts/app/app.module.7.ts +++ b/public/docs/_examples/router/ts/app/app.module.7.ts @@ -4,15 +4,14 @@ import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; -import { PageNotFoundComponent }from './not-found.component'; import { AppRoutingModule } from './app-routing.module'; import { HeroesModule } from './heroes/heroes.module'; import { CrisisCenterModule } from './crisis-center/crisis-center.module'; import { ComposeMessageComponent } from './compose-message.component'; - -import { LoginRoutingModule } from './login-routing.module'; -import { LoginComponent } from './login.component'; +import { LoginRoutingModule } from './login-routing.module'; +import { LoginComponent } from './login.component'; +import { PageNotFoundComponent } from './not-found.component'; import { DialogService } from './dialog.service'; @@ -28,12 +27,12 @@ import { DialogService } from './dialog.service'; declarations: [ AppComponent, ComposeMessageComponent, - LoginComponent + LoginComponent, + PageNotFoundComponent ], providers: [ DialogService ], bootstrap: [ AppComponent ] }) -export class AppModule { -} +export class AppModule { } diff --git a/public/docs/_examples/router/ts/app/app.module.ts b/public/docs/_examples/router/ts/app/app.module.ts index b580c10618..7164f6fa32 100644 --- a/public/docs/_examples/router/ts/app/app.module.ts +++ b/public/docs/_examples/router/ts/app/app.module.ts @@ -3,16 +3,16 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; -import { AppComponent } from './app.component'; -import { PageNotFoundComponent } from './not-found.component'; -import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; -import { HeroesModule } from './heroes/heroes.module'; -import { ComposeMessageComponent } from './compose-message.component'; -import { LoginRoutingModule } from './login-routing.module'; -import { LoginComponent } from './login.component'; +import { HeroesModule } from './heroes/heroes.module'; +import { ComposeMessageComponent } from './compose-message.component'; +import { LoginRoutingModule } from './login-routing.module'; +import { LoginComponent } from './login.component'; +import { PageNotFoundComponent } from './not-found.component'; -import { DialogService } from './dialog.service'; +import { DialogService } from './dialog.service'; @NgModule({ imports: [ @@ -25,13 +25,12 @@ import { DialogService } from './dialog.service'; declarations: [ AppComponent, ComposeMessageComponent, - LoginComponent + LoginComponent, + PageNotFoundComponent ], providers: [ DialogService ], bootstrap: [ AppComponent ] }) -export class AppModule { -} -// #enddocregion +export class AppModule { } diff --git a/public/docs/_examples/router/ts/app/auth-guard.service.ts b/public/docs/_examples/router/ts/app/auth-guard.service.ts index 5f93d07533..a32b5cc2b8 100755 --- a/public/docs/_examples/router/ts/app/auth-guard.service.ts +++ b/public/docs/_examples/router/ts/app/auth-guard.service.ts @@ -1,5 +1,4 @@ // #docplaster -// #docregion, admin-can-load import { Injectable } from '@angular/core'; import { CanActivate, Router, @@ -25,12 +24,13 @@ export class AuthGuard implements CanActivate, CanActivateChild, CanLoad { return this.canActivate(route, state); } +// #docregion, canLoad canLoad(route: Route): boolean { let url = `/${route.path}`; return this.checkLogin(url); } -// #enddocregion admin-can-load +// #enddocregion canLoad checkLogin(url: string): boolean { if (this.authService.isLoggedIn) { return true; } diff --git a/public/docs/_examples/router/ts/app/compose-message.component.1.ts b/public/docs/_examples/router/ts/app/compose-message.component.1.ts deleted file mode 100644 index 539c6fe5d6..0000000000 --- a/public/docs/_examples/router/ts/app/compose-message.component.1.ts +++ /dev/null @@ -1,108 +0,0 @@ -// #docplaster -// #docregion -// #docregion v1 -import 'rxjs/add/observable/of'; -import 'rxjs/add/operator/delay'; -import 'rxjs/add/operator/do'; -import { Component, HostBinding, - trigger, transition, - animate, style, state } from '@angular/core'; -import { Router } from '@angular/router'; - -import { Observable } from 'rxjs/Observable'; - -@Component({ - template: ` -

Contact Crisis Center

-
- {{ details }} -
-
-
- -
-
- -
-
-

- -// #enddocregion v1 - -// #docregion v1 -

- `, - styles: [ - ` - :host { - position: relative; - bottom: 10%; - } - ` - ], - animations: [ - trigger('routeAnimation', [ - state('*', - style({ - opacity: 1, - transform: 'translateX(0)' - }) - ), - transition(':enter', [ - style({ - opacity: 0, - transform: 'translateY(100%)' - }), - animate('0.2s ease-in') - ]), - transition(':leave', [ - animate('0.5s ease-out', style({ - opacity: 0, - transform: 'translateY(100%)' - })) - ]) - ]) - ] -}) -export class ComposeMessageComponent { - @HostBinding('@routeAnimation') get routeAnimation() { - return true; - } - - @HostBinding('style.display') get display() { - return 'block'; - } - - @HostBinding('style.position') get position() { - return 'absolute'; - } - - details: string; - sending: boolean = false; - - constructor(private router: Router) {} - - send() { - this.sending = true; - this.details = 'Sending Message...'; - - Observable.of(true) - .delay(1000) - .do(() => { - this.sending = false; -// #enddocregion v1 - this.closeModal(); -// #docregion v1 - }).subscribe(); - } - -// #enddocregion v1 - closeModal() { - this.router.navigate(['/', { outlets: { modal: null }}]); - } - - cancel() { - this.closeModal(); - } -} -// #enddocregion diff --git a/public/docs/_examples/router/ts/app/compose-message.component.html b/public/docs/_examples/router/ts/app/compose-message.component.html new file mode 100644 index 0000000000..8aaec9c746 --- /dev/null +++ b/public/docs/_examples/router/ts/app/compose-message.component.html @@ -0,0 +1,17 @@ + +

Contact Crisis Center

+
+ {{ details }} +
+
+
+ +
+
+ +
+
+

+ + +

diff --git a/public/docs/_examples/router/ts/app/compose-message.component.ts b/public/docs/_examples/router/ts/app/compose-message.component.ts index 57596e5cc3..d6b15ad38c 100644 --- a/public/docs/_examples/router/ts/app/compose-message.component.ts +++ b/public/docs/_examples/router/ts/app/compose-message.component.ts @@ -1,77 +1,19 @@ // #docregion -import 'rxjs/add/observable/of'; -import 'rxjs/add/operator/delay'; -import 'rxjs/add/operator/do'; -import { Component, HostBinding, - trigger, transition, - animate, style, state } from '@angular/core'; -import { Router } from '@angular/router'; +import { Component, HostBinding } from '@angular/core'; +import { Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; +import { slideInDownAnimation } from './animations'; @Component({ - template: ` -

Contact Crisis Center

-
- {{ details }} -
-
-
- -
-
- -
-
-

- - -

- `, - styles: [ - ` - :host { - position: relative; - bottom: 10%; - } - ` - ], - animations: [ - trigger('routeAnimation', [ - state('*', - style({ - opacity: 1, - transform: 'translateX(0)' - }) - ), - transition(':enter', [ - style({ - opacity: 0, - transform: 'translateY(100%)' - }), - animate('0.2s ease-in') - ]), - transition(':leave', [ - animate('0.5s ease-out', style({ - opacity: 0, - transform: 'translateY(100%)' - })) - ]) - ]) - ] + moduleId: module.id, + templateUrl: 'compose-message.component.html', + styles: [ ':host { position: relative; bottom: 10%; }' ], + animations: [ slideInDownAnimation ] }) export class ComposeMessageComponent { - @HostBinding('@routeAnimation') get routeAnimation() { - return true; - } - - @HostBinding('style.display') get display() { - return 'block'; - } - - @HostBinding('style.position') get position() { - return 'absolute'; - } + @HostBinding('@routeAnimation') routeAnimation = true; + @HostBinding('style.display') display = 'block'; + @HostBinding('style.position') position = 'absolute'; details: string; sending: boolean = false; @@ -82,24 +24,21 @@ export class ComposeMessageComponent { this.sending = true; this.details = 'Sending Message...'; - Observable.of(true) - .delay(1000) - .do(() => { - this.sending = false; - - // Close the modal - this.closeModal(); - }).subscribe(); - } - - closeModal() { - // Providing a `null` value to the named outlet - // clears the contents of the named outlet - this.router.navigate([{ outlets: { modal: null }}]); + setTimeout(() => { + this.sending = false; + this.closePopup(); + }, 1000); } cancel() { - // Close the modal - this.closeModal(); + this.closePopup(); } + + // #docregion closePopup + closePopup() { + // Providing a `null` value to the named outlet + // clears the contents of the named outlet + this.router.navigate([{ outlets: { popup: null }}]); + } + // #enddocregion closePopup } diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.2.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.2.ts index c3e3561dee..c86fa01c00 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.2.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.2.ts @@ -12,10 +12,10 @@ import { CrisisDetailComponent } from './crisis-detail.component'; // #docregion can-deactivate-guard import { CanDeactivateGuard } from '../can-deactivate-guard.service'; // #enddocregion can-deactivate-guard -// #docregion crisis-detail-resolve -import { CrisisDetailResolve } from './crisis-detail-resolve.service'; +// #docregion crisis-detail-resolver +import { CrisisDetailResolver } from './crisis-detail-resolver.service'; -// #enddocregion crisis-detail-resolve +// #enddocregion crisis-detail-resolver // #docregion routes const crisisCenterRoutes: Routes = [ @@ -43,11 +43,11 @@ const crisisCenterRoutes: Routes = [ // #docregion can-deactivate-guard canDeactivate: [CanDeactivateGuard], // #enddocregion can-deactivate-guard - // #docregion crisis-detail-resolve + // #docregion crisis-detail-resolver resolve: { - crisis: CrisisDetailResolve + crisis: CrisisDetailResolver } - // #enddocregion crisis-detail-resolve + // #enddocregion crisis-detail-resolver // #docregion routes }, { diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.4.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.4.ts index 15b346d01f..b7ac88e852 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.4.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.4.ts @@ -8,11 +8,12 @@ import { CrisisListComponent } from './crisis-list.component'; import { CrisisCenterComponent } from './crisis-center.component'; import { CrisisDetailComponent } from './crisis-detail.component'; -import { CanDeactivateGuard } from '../can-deactivate-guard.service'; +import { CanDeactivateGuard } from '../can-deactivate-guard.service'; -// #docregion crisis-detail-resolve -import { CrisisDetailResolve } from './crisis-detail-resolve.service'; +// #docregion crisis-detail-resolver +import { CrisisDetailResolver } from './crisis-detail-resolver.service'; +// #enddocregion crisis-detail-resolver const crisisCenterRoutes: Routes = [ // #docregion redirect { @@ -34,7 +35,7 @@ const crisisCenterRoutes: Routes = [ component: CrisisDetailComponent, canDeactivate: [CanDeactivateGuard], resolve: { - crisis: CrisisDetailResolve + crisis: CrisisDetailResolver } }, { @@ -47,6 +48,7 @@ const crisisCenterRoutes: Routes = [ } ]; +// #docregion crisis-detail-resolver @NgModule({ imports: [ RouterModule.forChild(crisisCenterRoutes) @@ -55,8 +57,9 @@ const crisisCenterRoutes: Routes = [ RouterModule ], providers: [ - CrisisDetailResolve + CrisisDetailResolver ] }) export class CrisisCenterRoutingModule { } +// #enddocregion crisis-detail-resolver // #enddocregion diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.ts index 75ca2a7ee8..c01d592455 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-center-routing.module.ts @@ -8,10 +8,8 @@ import { CrisisListComponent } from './crisis-list.component'; import { CrisisCenterComponent } from './crisis-center.component'; import { CrisisDetailComponent } from './crisis-detail.component'; -import { CanDeactivateGuard } from '../can-deactivate-guard.service'; - -// #docregion crisis-detail-resolve -import { CrisisDetailResolve } from './crisis-detail-resolve.service'; +import { CanDeactivateGuard } from '../can-deactivate-guard.service'; +import { CrisisDetailResolver } from './crisis-detail-resolver.service'; const crisisCenterRoutes: Routes = [ { @@ -27,7 +25,7 @@ const crisisCenterRoutes: Routes = [ component: CrisisDetailComponent, canDeactivate: [CanDeactivateGuard], resolve: { - crisis: CrisisDetailResolve + crisis: CrisisDetailResolver } }, { @@ -48,7 +46,7 @@ const crisisCenterRoutes: Routes = [ RouterModule ], providers: [ - CrisisDetailResolve + CrisisDetailResolver ] }) export class CrisisCenterRoutingModule { } diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-center.module.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-center.module.ts index fddf7ca421..483dda20d5 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-center.module.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-center.module.ts @@ -28,7 +28,7 @@ import { CrisisCenterRoutingModule } from './crisis-center-routing.module'; providers: [ CrisisService ] - // #enddocregion crisis-detail-resolve + // #enddocregion crisis-detail-resolver }) // #docregion crisis-center-module-export export class CrisisCenterModule {} diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolve.service.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolver.service.ts similarity index 91% rename from public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolve.service.ts rename to public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolver.service.ts index 2a22c7cbb5..94b4cd33e7 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolve.service.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail-resolver.service.ts @@ -6,7 +6,7 @@ import { Router, Resolve, RouterStateSnapshot, import { Crisis, CrisisService } from './crisis.service'; @Injectable() -export class CrisisDetailResolve implements Resolve { +export class CrisisDetailResolver implements Resolve { constructor(private cs: CrisisService, private router: Router) {} resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.1.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.1.ts index b314fb615f..d6fa27f629 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.1.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.1.ts @@ -1,16 +1,14 @@ // #docplaster // #docregion import 'rxjs/add/operator/switchMap'; -import { Component, OnInit, - HostBinding, trigger, transition, - animate, style, state } from '@angular/core'; +import { Component, OnInit, HostBinding } from '@angular/core'; import { ActivatedRoute, Router, Params } from '@angular/router'; +import { slideInDownAnimation } from '../animations'; import { Crisis, CrisisService } from './crisis.service'; import { DialogService } from '../dialog.service'; @Component({ - // #docregion template template: `

"{{ editName }}"

@@ -26,50 +24,17 @@ import { DialogService } from '../dialog.service';

`, - // #enddocregion template styles: ['input {width: 20em}'], - animations: [ - trigger('routeAnimation', [ - state('*', - style({ - opacity: 1, - transform: 'translateX(0)' - }) - ), - transition(':enter', [ - style({ - opacity: 0, - transform: 'translateX(-100%)' - }), - animate('0.2s ease-in') - ]), - transition(':leave', [ - animate('0.5s ease-out', style({ - opacity: 0, - transform: 'translateY(100%)' - })) - ]) - ]) - ] + animations: [ slideInDownAnimation ] }) -// #docregion cancel-save export class CrisisDetailComponent implements OnInit { - @HostBinding('@routeAnimation') get routeAnimation() { - return true; - } - - @HostBinding('style.display') get display() { - return 'block'; - } - - @HostBinding('style.position') get position() { - return 'absolute'; - } + @HostBinding('@routeAnimation') routeAnimation = true; + @HostBinding('style.display') display = 'block'; + @HostBinding('style.position') position = 'absolute'; crisis: Crisis; editName: string; -// #enddocregion cancel-save constructor( private service: CrisisService, private router: Router, @@ -92,7 +57,6 @@ export class CrisisDetailComponent implements OnInit { } // #enddocregion ngOnInit - // #docregion cancel-save cancel() { this.gotoCrises(); } @@ -101,9 +65,7 @@ export class CrisisDetailComponent implements OnInit { this.crisis.name = this.editName; this.gotoCrises(); } - // #enddocregion cancel-save - // #docregion cancel-save-only canDeactivate(): Promise | boolean { // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged if (!this.crisis || this.crisis.name === this.editName) { @@ -113,9 +75,7 @@ export class CrisisDetailComponent implements OnInit { // promise which resolves to true or false when the user decides return this.dialogService.confirm('Discard changes?'); } - // #enddocregion cancel-save-only - // #docregion gotoCrises, relative-navigation gotoCrises() { let crisisId = this.crisis ? this.crisis.id : null; // Pass along the crisis id if available @@ -124,8 +84,4 @@ export class CrisisDetailComponent implements OnInit { // Relative navigation back to the crises this.router.navigate(['../', { id: crisisId, foo: 'foo' }], { relativeTo: this.route }); } - // #enddocregion gotoCrises, relative-navigation -// #docregion cancel-save } -// #enddocregion cancel-save -// #enddocregion diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.ts index d121242a13..f0939b47a8 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-detail.component.ts @@ -1,10 +1,9 @@ // #docplaster // #docregion -import { Component, OnInit, HostBinding, - trigger, transition, - animate, style, state } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; +import { Component, OnInit, HostBinding } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { slideInDownAnimation } from '../animations'; import { Crisis } from './crisis.service'; import { DialogService } from '../dialog.service'; @@ -25,43 +24,12 @@ import { DialogService } from '../dialog.service'; `, styles: ['input {width: 20em}'], - // #enddocregion template - animations: [ - trigger('routeAnimation', [ - state('*', - style({ - opacity: 1, - transform: 'translateX(0)' - }) - ), - transition(':enter', [ - style({ - opacity: 0, - transform: 'translateX(-100%)' - }), - animate('0.2s ease-in') - ]), - transition(':leave', [ - animate('0.5s ease-out', style({ - opacity: 0, - transform: 'translateY(100%)' - })) - ]) - ]) - ] + animations: [ slideInDownAnimation ] }) export class CrisisDetailComponent implements OnInit { - @HostBinding('@routeAnimation') get routeAnimation() { - return true; - } - - @HostBinding('style.display') get display() { - return 'block'; - } - - @HostBinding('style.position') get position() { - return 'absolute'; - } + @HostBinding('@routeAnimation') routeAnimation = true; + @HostBinding('style.display') display = 'block'; + @HostBinding('style.position') position = 'absolute'; crisis: Crisis; editName: string; @@ -72,7 +40,7 @@ export class CrisisDetailComponent implements OnInit { public dialogService: DialogService ) {} -// #docregion crisis-detail-resolve +// #docregion ngOnInit ngOnInit() { this.route.data .subscribe((data: { crisis: Crisis }) => { @@ -80,8 +48,9 @@ export class CrisisDetailComponent implements OnInit { this.crisis = data.crisis; }); } -// #enddocregion crisis-detail-resolve +// #enddocregion ngOnInit + // #docregion cancel-save cancel() { this.gotoCrises(); } @@ -90,7 +59,9 @@ export class CrisisDetailComponent implements OnInit { this.crisis.name = this.editName; this.gotoCrises(); } + // #enddocregion cancel-save + // #docregion canDeactivate canDeactivate(): Promise | boolean { // Allow synchronous navigation (`true`) if no crisis or the crisis is unchanged if (!this.crisis || this.crisis.name === this.editName) { @@ -100,17 +71,16 @@ export class CrisisDetailComponent implements OnInit { // promise which resolves to true or false when the user decides return this.dialogService.confirm('Discard changes?'); } + // #enddocregion canDeactivate - // #docregion gotoCrises gotoCrises() { let crisisId = this.crisis ? this.crisis.id : null; // Pass along the crisis id if available // so that the CrisisListComponent can select that crisis. // Add a totally useless `foo` parameter for kicks. - // #docregion gotoCrises-navigate + // #docregion gotoCrises-navigate // Relative navigation back to the crises this.router.navigate(['../', { id: crisisId, foo: 'foo' }], { relativeTo: this.route }); - // #enddocregion gotoCrises-navigate + // #enddocregion gotoCrises-navigate } - // #enddocregion gotoCrises } diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.1.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.1.ts index 53b9773212..0000dde082 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.1.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.1.ts @@ -1,5 +1,3 @@ -// #docplaster -// #docregion import 'rxjs/add/operator/do'; import 'rxjs/add/operator/switchMap'; import { Component, OnInit } from '@angular/core'; @@ -9,28 +7,28 @@ import { Crisis, CrisisService } from './crisis.service'; import { Observable } from 'rxjs/Observable'; @Component({ - // #docregion template + // #docregion relative-navigation-router-link template: ` - `, - // #enddocregion template + ` + // #enddocregion relative-navigation-router-link }) export class CrisisListComponent implements OnInit { crises: Observable; selectedId: number; - // #docregion relative-navigation-ctor constructor( private service: CrisisService, private route: ActivatedRoute, private router: Router ) {} - // #enddocregion relative-navigation-ctor ngOnInit() { this.crises = this.route.params @@ -40,17 +38,7 @@ export class CrisisListComponent implements OnInit { }); } - // #docregion select - onSelect(crisis: Crisis) { - // Absolute link - this.router.navigate([crisis.id]); + isSelected(crisis: Crisis) { + return crisis.id === this.selectedId; } - // #enddocregion select } -// #enddocregion - -/* -// #docregion relative-navigation-router-link -{{ crisis.name }} -// #enddocregion relative-navigation-router-link -*/ diff --git a/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.ts b/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.ts index 2b52f43f57..4498a55c0f 100644 --- a/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.ts +++ b/public/docs/_examples/router/ts/app/crisis-center/crisis-list.component.ts @@ -1,4 +1,3 @@ -// #docplaster // #docregion import 'rxjs/add/operator/switchMap'; import { Component, OnInit } from '@angular/core'; @@ -12,9 +11,10 @@ import { Crisis, CrisisService } from './crisis.service'; template: `
  • - {{ crisis.id }} {{ crisis.name }} + (click)="onSelect(crisis)" + [class.selected]="isSelected(crisis)"> + {{ crisis.id }} + {{ crisis.name }}
@@ -25,11 +25,13 @@ export class CrisisListComponent implements OnInit { crises: Observable; selectedId: number; + // #docregion ctor constructor( private service: CrisisService, private route: ActivatedRoute, private router: Router ) {} + // #enddocregion ctor isSelected(crisis: Crisis) { return crisis.id === this.selectedId; @@ -43,12 +45,12 @@ export class CrisisListComponent implements OnInit { }); } - // #docregion relative-navigation + // #docregion onSelect onSelect(crisis: Crisis) { this.selectedId = crisis.id; // Navigate with relative link this.router.navigate([crisis.id], { relativeTo: this.route }); } - // #enddocregion relative-navigation + // #enddocregion onSelect } diff --git a/public/docs/_examples/router/ts/app/hero-list.component.ts b/public/docs/_examples/router/ts/app/hero-list.component.ts index 6ca130c89e..7a8f97ca1e 100644 --- a/public/docs/_examples/router/ts/app/hero-list.component.ts +++ b/public/docs/_examples/router/ts/app/hero-list.component.ts @@ -7,7 +7,7 @@ import { Component } from '@angular/core';

HEROES

Get your heroes here

- + ` }) export class HeroListComponent { } diff --git a/public/docs/_examples/router/ts/app/heroes/hero-detail.component.ts b/public/docs/_examples/router/ts/app/heroes/hero-detail.component.ts index c528651f44..8135d37d32 100644 --- a/public/docs/_examples/router/ts/app/heroes/hero-detail.component.ts +++ b/public/docs/_examples/router/ts/app/heroes/hero-detail.component.ts @@ -2,17 +2,14 @@ // #docregion // #docregion rxjs-operator-import import 'rxjs/add/operator/switchMap'; -// #docregion rxjs-operator-import -// #docregion route-animation-imports -import { Component, OnInit, HostBinding, - trigger, transition, animate, - style, state } from '@angular/core'; -// #enddocregion route-animation-imports +// #enddocregion rxjs-operator-import +import { Component, OnInit, HostBinding } from '@angular/core'; import { Router, ActivatedRoute, Params } from '@angular/router'; +import { slideInDownAnimation } from '../animations'; + import { Hero, HeroService } from './hero.service'; -// #docregion route-animation @Component({ template: `

HEROES

@@ -29,44 +26,14 @@ import { Hero, HeroService } from './hero.service';

`, - animations: [ - trigger('routeAnimation', [ - state('*', - style({ - opacity: 1, - transform: 'translateX(0)' - }) - ), - transition(':enter', [ - style({ - opacity: 0, - transform: 'translateX(-100%)' - }), - animate('0.2s ease-in') - ]), - transition(':leave', [ - animate('0.5s ease-out', style({ - opacity: 0, - transform: 'translateY(100%)' - })) - ]) - ]) - ] + animations: [ slideInDownAnimation ] }) -// #docregion route-animation-host-binding export class HeroDetailComponent implements OnInit { -// #enddocregion route-animation - @HostBinding('@routeAnimation') get routeAnimation() { - return true; - } - - @HostBinding('style.display') get display() { - return 'block'; - } - - @HostBinding('style.position') get position() { - return 'absolute'; - } +// #docregion host-bindings + @HostBinding('@routeAnimation') routeAnimation = true; + @HostBinding('style.display') display = 'block'; + @HostBinding('style.position') position = 'absolute'; +// #enddocregion host-bindings hero: Hero; @@ -87,14 +54,13 @@ export class HeroDetailComponent implements OnInit { } // #enddocregion ngOnInit - // #docregion gotoHeroes-navigate + // #docregion gotoHeroes gotoHeroes() { let heroId = this.hero ? this.hero.id : null; // Pass along the hero id if available // so that the HeroList component can select that hero. + // Include a junk 'foo' property for fun. this.router.navigate(['/heroes', { id: heroId, foo: 'foo' }]); } - // #enddocregion gotoHeroes-navigate -// #docregion route-animation-host-binding + // #enddocregion gotoHeroes } -// #enddocregion route-animation-host-binding diff --git a/public/docs/_examples/router/ts/app/heroes/hero-list.component.1.ts b/public/docs/_examples/router/ts/app/heroes/hero-list.component.1.ts index 37b129c0e7..59552830a4 100644 --- a/public/docs/_examples/router/ts/app/heroes/hero-list.component.1.ts +++ b/public/docs/_examples/router/ts/app/heroes/hero-list.component.1.ts @@ -17,7 +17,7 @@ import { Hero, HeroService } from './hero.service'; - + ` // #enddocregion template }) diff --git a/public/docs/_examples/router/ts/app/heroes/hero-list.component.ts b/public/docs/_examples/router/ts/app/heroes/hero-list.component.ts index d4373a6e3a..d418d0731f 100644 --- a/public/docs/_examples/router/ts/app/heroes/hero-list.component.ts +++ b/public/docs/_examples/router/ts/app/heroes/hero-list.component.ts @@ -24,7 +24,7 @@ import { Hero, HeroService } from './hero.service'; - + ` // #enddocregion template }) diff --git a/public/docs/_examples/router/ts/app/not-found.component.ts b/public/docs/_examples/router/ts/app/not-found.component.ts index 4a9f60cc32..2e74544e17 100644 --- a/public/docs/_examples/router/ts/app/not-found.component.ts +++ b/public/docs/_examples/router/ts/app/not-found.component.ts @@ -2,8 +2,6 @@ import { Component } from '@angular/core'; @Component({ - template: ` -

Page Not Found

- ` + template: '

Page not found

' }) export class PageNotFoundComponent {} diff --git a/public/docs/_examples/router/ts/app/selective-preload-strategy.ts b/public/docs/_examples/router/ts/app/selective-preloading-strategy.ts similarity index 79% rename from public/docs/_examples/router/ts/app/selective-preload-strategy.ts rename to public/docs/_examples/router/ts/app/selective-preloading-strategy.ts index ebbd40d294..0e06cd8a38 100644 --- a/public/docs/_examples/router/ts/app/selective-preload-strategy.ts +++ b/public/docs/_examples/router/ts/app/selective-preloading-strategy.ts @@ -5,10 +5,10 @@ import { PreloadingStrategy, Route } from '@angular/router'; import { Observable } from 'rxjs/Observable'; @Injectable() -export class PreloadSelectedModules implements PreloadingStrategy { +export class SelectivePreloadingStrategy implements PreloadingStrategy { preloadedModules: string[] = []; - preload(route: Route, load: Function): Observable { + preload(route: Route, load: () => Observable): Observable { if (route.data && route.data['preload']) { // add the route path to our preloaded module array this.preloadedModules.push(route.path); diff --git a/public/docs/_examples/router/ts/index.1.html b/public/docs/_examples/router/ts/index.1.html deleted file mode 100644 index 427becd129..0000000000 --- a/public/docs/_examples/router/ts/index.1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - Router Sample v.1 - - - - - - - - - - - - - - - - -

Milestone 1

- loading... - - - - diff --git a/public/docs/_examples/router/ts/index.html b/public/docs/_examples/router/ts/index.html index 1195b38267..93114d517b 100644 --- a/public/docs/_examples/router/ts/index.html +++ b/public/docs/_examples/router/ts/index.html @@ -3,7 +3,9 @@ + + Router Sample diff --git a/public/docs/_examples/router/ts/plnkr.json b/public/docs/_examples/router/ts/plnkr.json index 0d7187d384..5a01a66f8a 100644 --- a/public/docs/_examples/router/ts/plnkr.json +++ b/public/docs/_examples/router/ts/plnkr.json @@ -5,9 +5,7 @@ "!**/*.js", "!**/*.[0-9].*", "!app/crisis-list.component.ts", - "!app/hero-list.component.ts", - "!app/crisis-center/add-crisis.component.ts", - "!app/not-found.component.ts" + "!app/hero-list.component.ts" ], "tags": ["router"] } diff --git a/public/docs/ts/latest/guide/change-log.jade b/public/docs/ts/latest/guide/change-log.jade index 69b1f9d29b..3493102fa5 100644 --- a/public/docs/ts/latest/guide/change-log.jade +++ b/public/docs/ts/latest/guide/change-log.jade @@ -5,6 +5,10 @@ block includes The Angular documentation is a living document with continuous improvements. This log calls attention to recent significant changes. + ## Router: more detail (2016-12-21) + Added more information to the [Router](router.html) guide + including sections named outlets, wildcard routes, and preload strategies. + ## Http: how to set default request headers (and other request options) (2016-12-14) Added section on how to set default request headers (and other request options) to [Http](server-communication.html#override-default-request-options) guide. diff --git a/public/docs/ts/latest/guide/router.jade b/public/docs/ts/latest/guide/router.jade index a97bafb510..d258167d55 100644 --- a/public/docs/ts/latest/guide/router.jade +++ b/public/docs/ts/latest/guide/router.jade @@ -1,11 +1,11 @@ include ../_util-fns :marked - The Angular ***Router*** enables navigation from one [view](./glossary.html#view) to the next + The Angular **`Router`** enables navigation from one [view](./glossary.html#view) to the next as users perform application tasks. - We cover the router's primary features in this chapter, illustrating them through the evolution - of a small application that we can run live. + This guide covers the router's primary features, illustrating them through the evolution + of a small application that you can run live in the browser. include ../../../_includes/_see-addr-bar @@ -13,34 +13,35 @@ include ../../../_includes/_see-addr-bar :marked ## Overview - The browser is a familiar model of application navigation. - We enter a URL in the address bar and the browser navigates to a corresponding page. - We click links on the page and the browser navigates to a new page. - We click the browser's back and forward buttons and the browser navigates - backward and forward through the history of pages we've seen. + The browser is a familiar model of application navigation: + * Enter a URL in the address bar and the browser navigates to a corresponding page. + * Click links on the page and the browser navigates to a new page. + * Click the browser's back and forward buttons and the browser navigates + backward and forward through the history of pages you've seen. - The Angular ***Router*** ("the router") borrows from this model. - It can interpret a browser URL as an instruction - to navigate to a client-generated view and pass optional parameters along to the supporting view component - to help it decide what specific content to present. - We can bind the router to links on a page and it will navigate to + The Angular *`Router` ("the router") borrows from this model. + It can interpret a browser URL as an instruction to navigate to a client-generated view. + It can pass optional parameters along to the supporting view component that help it decide what specific content to present. + You can bind the router to links on a page and it will navigate to the appropriate application view when the user clicks a link. - We can navigate imperatively when the user clicks a button, selects from a drop box, + You can navigate imperatively when the user clicks a button, selects from a drop box, or in response to some other stimulus from any source. And the router logs activity in the browser's history journal so the back and forward buttons work as well. - We'll learn many router details in this chapter which covers + You'll learn many router details in this guide which covers * Setting the [base href](#base-href) * Importing from the [router library](#import) * [configuring the router](#route-config) * handling unmatched URLs with a [wildcard route](#wildcard-route) * the [link parameters array](#link-parameters-array) that propels router navigation + * setting the [default route](#default-route) where the application navigates at launch + * [redirecting](#redirect) from one route to another * navigating when the user clicks a data-bound [RouterLink](#router-link) * navigating under [program control](#navigate) * retrieving information from the [route](#activated-route) * [animating](#route-animation) transitions for route components - * navigating [relative](#relative-navigation) to our current URL + * navigating [relative](#relative-navigation) to the current URL * toggling css classes for the [active router link](#router-link-active) * embedding critical information in the URL with [route parameters](#route-parameters) * providing non-critical information in [optional route parameters](#optional-route-parameters) @@ -48,7 +49,6 @@ include ../../../_includes/_see-addr-bar * add [child routes](#child-routing-component) under a feature section * [grouping child routes](#component-less-route) without a component * displaying [multiple routes](#named-outlets) in separate outlets - * [redirecting](#redirect) from one route to another * confirming or canceling navigation with [guards](#guards) * [CanActivate](#can-activate-guard) to prevent navigation to a route * [CanActivateChild](#can-activate-child-guard) to prevent navigation to a child route @@ -58,146 +58,134 @@ include ../../../_includes/_see-addr-bar * providing optional information across routes with [query parameters](#query-parameters) * jumping to anchor elements using a [fragment](#fragment) * loading feature areas [asynchronously](#asynchronous-routing) - * pre-loading feature areas [during navigation](#preloading) - * using a [custom strategy](#custom-preloading) to only pre-load certain features + * preloading feature areas [during navigation](#preloading) + * using a [custom strategy](#custom-preloading) to only preload certain features * choosing the "HTML5" or "hash" [URL style](#browser-url-styles) - We proceed in phases marked by milestones building from a simple two-pager with placeholder views - up to a modular, multi-view design with child routes. - - But first, an overview of router basics. - .l-main-section :marked ## The Basics - Let's begin with a few core concepts of the Router. - Then we can explore the details through a sequence of examples. + + This guide proceeds in phases, marked by milestones, starting from a simple two-pager + and building toward a modular, multi-view design with child routes. + + An introduction to a few core Router concepts will help orient you to the details that follow. :marked ### *<base href>* - Most routing applications should add a `` element to the **`index.html`** as the first child in the `` tag + Most routing applications should add a `` element to the `index.html` as the first child in the `` tag to tell the router how to compose navigation URLs. - If the `app` folder is the application root, as it is for our sample application, + If the `app` folder is the application root, as it is for the sample application, set the `href` value *exactly* as shown here. -+makeExcerpt('index.1.html', 'base-href') ++makeExcerpt('index.html', 'base-href') :marked ### Router imports The Angular Router is an optional service that presents a particular component view for a given URL. It is not part of the Angular core. It is in its own library package, `@angular/router`. - We import what we need from it as we would from any other Angular package. + Import what you need from it as you would from any other Angular package. +makeExcerpt('app/app.module.1.ts (import)', 'import-router') .l-sub-section :marked - We cover other options in the [details below](#browser-url-styles). + You'll learn about more options in the [details below](#browser-url-styles). :marked ### Configuration - The application will have one, singleton instance of the *`Router`* service. - When the browser's URL changes, that router looks for a corresponding **`Route`** + A routed Angular application has one, singleton instance of the *`Router`* service. + When the browser's URL changes, that router looks for a corresponding `Route` from which it can determine the component to display. - A router has no routes until we configure it. - In the following example, we create four route definitions, configure the router via the **`RouterModule.forRoot`** method, - and add the result to the `AppModule`'s `imports` array. + A router has no routes until you configure it. + The following example creates four route definitions, configures the router via the `RouterModule.forRoot` method, + and adds the result to the `AppModule`'s `imports` array. -+makeExcerpt('app/app.module.0.ts (excerpt)', 'route-config') ++makeExcerpt('app/app.module.0.ts (excerpt)', '') - -.l-sub-section - :marked - The `RouterModule` is provided an array of *routes* that describe how to navigate. - Each *Route* maps a URL `path` to a component. +a#example-config +:marked + The `appRoutes` array of *routes* describes how to navigate. + Pass it to the `Router.forRoot` method in the module `imports` to configure the router. - There are no **leading slashes** in our **path**. The router parses and builds the URL for us, - allowing us to use relative and absolute paths when navigating between application views. + Each `Route` maps a URL `path` to a component. + There are _no leading slashes_ in the _path_. + The router parses and builds the final URL for you, + allowing you to use both relative and "absolute" paths when navigating between application views. - The `:id` in the first route is a token for a route parameter. In a URL such as `/hero/42`, "42" - is the value of the `id` parameter. The corresponding `HeroDetailComponent` - will use that value to find and present the hero whose `id` is 42. - We'll learn more about route parameters later in this chapter. + The `:id` in the first route is a token for a route parameter. In a URL such as `/hero/42`, "42" + is the value of the `id` parameter. The corresponding `HeroDetailComponent` + will use that value to find and present the hero whose `id` is 42. + You'll learn more about route parameters later in this guide. - The `data` property in the third route is a place to store arbitrary data associated with each - specific route. This data is accessible within each activated route and can be used to store - items such as page titles, breadcrumb text and other read-only data. We'll use the [resolve guard](#resolve-guard) - to retrieve additional data later in the chapter. + The `data` property in the third route is a place to store arbitrary data associated with + this specific route. The data property is accessible within each activated route. Use it to store + items such as page titles, breadcrumb text, and other read-only, _static_ data. + You'll use the [resolve guard](#resolve-guard) to retrieve _dynamic_ data later in the guide. - The `empty path` in the fourth route matches as the default path for each level of routing. It - also allows for adding routes without extending the URL path. + The `empty path` in the fourth route represents the default path for the application, + the place to go when the path in the URL is empty, as it typically is at the start. + This default route redirects to the route for the `/heroes` URL and, therefore, will display the `HeroesListComponent`. - The `**` in the last route denotes a **wildcard** path for our route. The router will match this route - if the URL requested doesn't match any paths for routes defined in our configuration. This is useful for - displaying a 404 page or redirecting to another route. + The `**` path in the last route is a **wildcard**. The router will select this route + if the requested URL doesn't match any paths for routes defined earlier in the configuration. + This is useful for displaying a "404 - Not Found" page or redirecting to another route. - **The order of the routes in the configuration matters** and this is by design. The router uses a **first-match wins** - strategy when matching routes, so more specific routes should be placed above less specific routes. In our - configuration above, the routes with a static path are listed first, followed by an empty path route, - that matches as the default route. The wildcard route is listed last as it's the most generic route and should be - matched **only** if no other routes are matched first. + **The order of the routes in the configuration matters** and this is by design. The router uses a **first-match wins** + strategy when matching routes, so more specific routes should be placed above less specific routes. + In the configuration above, routes with a static path are listed first, followed by an empty path route, + that matches the default route. + The wildcard route comes last because it matches _every URL_ and should be selected _only_ if no other routes are matched first. :marked ### Router Outlet Given this configuration, when the browser URL for this application becomes `/heroes`, - the router matches that URL to the `Route` path `/heroes` and displays the `HeroListComponent` - ***after*** a **`RouterOutlet`** that we've placed in the host view's HTML. + the router matches that URL to the route path `/heroes` and displays the `HeroListComponent` + _after_ a `RouterOutlet` that you've placed in the host view's HTML. code-example(language="html"). <router-outlet></router-outlet> <!-- Routed views go here --> :marked ### Router Links - Now we have routes configured and a place to render them, but - how do we navigate? The URL could arrive directly from the browser address bar. - But most of the time we navigate as a result of some user action such as the click of + Now you have routes configured and a place to render them, but + how do you navigate? The URL could arrive directly from the browser address bar. + But most of the time you navigate as a result of some user action such as the click of an anchor tag. - We add a **`RouterLink`** directive to the anchor tag. Since - we know our link doesn't contain any dynamic information, we can use a one-time binding to our route *path*. - - If our `RouterLink` needed to be more dynamic we could bind to a template expression that - returns an array of route link parameters (the **link parameters array**). The router ultimately resolves that array - into a URL and a component view. - - We also add a **`RouterLinkActive`** directive to each anchor tag to add or remove CSS classes to the - element when the associated *RouterLink* becomes active. The directive can be added directly on the element - or on its parent element. - - We see such bindings in the following `AppComponent` template: + Consider the following template: +makeExcerpt('app/app.component.1.ts', 'template', '') +:marked + The `RouterLink` directive on the anchor tags gives the router control over those elements. + The navigation paths are fixed, so you can assign a string to the `routerLink` (a "one-time" binding). -.l-sub-section - :marked - We're adding two anchor tags with `RouterLink` and `RouterLinkActive` directives. - We bind each `RouterLink` to a string containing the path of a route. - '/crisis-center' and '/heroes' are the paths of the `Routes` we configured above. + Had the navigation path been more dynamic, you could have bound to a template expression that + returned an array of route link parameters (the _link parameters array_). + The router resolves that array into a complete URL. - We'll learn to write link expressions — and why they are arrays — - [later](#link-parameters-array) in the chapter. - - We define `active` as the CSS class we want toggled to each `RouterLink` when they become - the current route using the `RouterLinkActive ` directive. We could add multiple classes to - the `RouterLink` if we so desired. + The **`RouterLinkActive`** directive on each anchor tag helps visually distinguish the anchor for the currently selected "active" route. + The router adds the `active` CSS class to the element when the associated *RouterLink* becomes active. + You can add this directive to the anchor or to its parent element. :marked ### Router State After the end of each successful navigation lifecycle, the router builds a tree of `ActivatedRoute` objects - that make up the current state of the router. We can access the current `RouterState` from anywhere in our + that make up the current state of the router. You can access the current `RouterState` from anywhere in the application using the `Router` service and the `routerState` property. Each `ActivatedRoute` in the `RouterState` provides methods to traverse up and down the route tree - to get information we may need from parent, child and sibling routes. + to get information from parent, child and sibling routes. :marked - ### Let's summarize + ### Summary - The application is provided with a configured router. - The component has a `RouterOutlet` where it can display views produced by the router. + The application has a configured router. + The shell component has a `RouterOutlet` where it can display views produced by the router. It has `RouterLink`s that users can click to navigate via the router. - Here are the key *Router* terms and their meanings: + Here are the key `Router` terms and their meanings: +style td, th {vertical-align: top} table tr th Router Part @@ -245,98 +233,25 @@ table td RouterState td. The current state of the router including a tree of the currently activated - routes in our application along convenience methods for traversing the route tree. + routes together with convenience methods for traversing the route tree. tr td Link Parameters Array td. - An array that the router interprets into a routing instruction. - We can bind a RouterLink to that array or pass the array as an argument to + An array that the router interprets as a routing instruction. + You can bind that array to a RouterLink or pass the array as an argument to the Router.navigate method. tr td Routing Component td. An Angular component with a RouterOutlet that displays views based on router navigations. -:marked - We've barely touched the surface of the router and its capabilities. - - The following detail sections describe a sample routing application - as it evolves over a sequence of milestones. - We strongly recommend taking the time to read and understand this story. +a#getting-started .l-main-section :marked ## The Sample Application - We have an application in mind as we move from milestone to milestone. -.l-sub-section - :marked - While we make incremental progress toward the ultimate sample application, this chapter is not a tutorial. - We discuss code and design decisions pertinent to routing and application design. - We gloss over everything in between. - - The full source is available in the . - -:marked - Our client is the Hero Employment Agency. - Heroes need work and The Agency finds Crises for them to solve. - - The application has three main feature areas: - 1. A *Crisis Center* where we maintain the list of crises for assignment to heroes. - 1. A *Heroes* area where we maintain the list of heroes employed by The Agency. - 1. An *Admin* area where we manage the list of crises and heroes displayed. - - Run the . - It opens in the *Crisis Center*. We'll come back to that. - - Click the *Heroes* link. We're presented with a list of Heroes. -figure.image-display - img(src='/resources/images/devguide/router/hero-list.png' alt="Hero List" width="250") -:marked - We select one and the application takes us to a hero editing screen. -figure.image-display - img(src='/resources/images/devguide/router/hero-detail.png' alt="Crisis Center Detail" width="250") -:marked - Our changes take effect immediately. We click the "Back" button and the - app returns us to the Heroes list. - - We could have clicked the browser's back button instead. - That would have returned us to the Heroes List as well. - Angular app navigation updates the browser history as normal web navigation does. - - Now click the *Crisis Center* link. We go to the *Crisis Center* and its list of ongoing crises. -figure.image-display - img(src='/resources/images/devguide/router/crisis-center-list.png' alt="Crisis Center List" ) -:marked - We select one and the application takes us to a crisis editing screen. -figure.image-display - img(src='/resources/images/devguide/router/crisis-center-detail.png' alt="Crisis Center Detail") -:marked - This is a bit different from the *Hero Detail*. *Hero Detail* saves the changes as we type. - In *Crisis Detail* our changes are temporary until we either save or discard them by pressing the "Save" or "Cancel" buttons. - Both buttons navigate back to the *Crisis Center* and its list of crises. - - Suppose we click a crisis, make a change, but ***do not click either button***. - Maybe we click the browser back button instead. Maybe we click the "Heroes" link. - - Do either. Up pops a dialog box. -figure.image-display - img(src='/resources/images/devguide/router/confirm-dialog.png' alt="Confirm Dialog" width="300") -:marked - We can say "OK" and lose our changes or click "Cancel" and continue editing. - - The router supports a `CanDeactivate` guard that gives us a chance to clean-up - or ask the user's permission before navigating away from the current view. - - Here we see an entire user session that touches all of these features. - -figure.image-display - img(src='/resources/images/devguide/router/router-anim.gif' alt="App in action" ) -:marked - Here's a diagram of all application routing options: -figure.image-display - img(src='/resources/images/devguide/router/complete-nav.png' alt="Navigation diagram" ) -:marked - This app illustrates the router features we'll cover in this chapter + This guide describes development of a multi-page routed sample application. + Along the way, it highlights design decisions and describes key features of the router such as: * organizing the application features into modules * navigating to a component (*Heroes* link to "Heroes List") @@ -349,73 +264,144 @@ figure.image-display * lazy loading feature modules * the `CanLoad` guard (check before loading feature module assets) - + The guide proceeds as a sequence of milestones as if you were building the app step-by-step. + But it is not a tutorial and it glosses over details of Angular application construction + that are more thoroughly covered elsewhere in the documentation. + + The full source for the final version of the app can be seen and downloaded from the . + +:marked + ### The sample application in action + + Imagine an application that helps the _Hero Employment Agency_ run its business. + Heroes need work and the agency finds crises for them to solve. + + The application has three main feature areas: + 1. A *Crisis Center* for maintaining the list of crises for assignment to heroes. + 1. A *Heroes* area for maintaining the list of heroes employed by The Agency. + 1. An *Admin* area to manage the list of crises and heroes. + + Try it by clicking on this live example link. + + Once the app warms up, you'll see a row of navigation buttons + and the *Heroes* view with its list of heroes. + +figure.image-display + img(src='/resources/images/devguide/router/hero-list.png' alt="Hero List" width="250") +:marked + Select one hero and the app takes you to a hero editing screen. +figure.image-display + img(src='/resources/images/devguide/router/hero-detail.png' alt="Crisis Center Detail" width="250") +:marked + Alter the name. + Click the "Back" button and the app returns to the heroes list which displays the changed hero name. + Notice that the name change took effect immediately. + + Had you clicked the browser's back button instead of the "Back" button, + the app would have returned you to the heroes List as well. + Angular app navigation updates the browser history as normal web navigation does. + + Now click the *Crisis Center* link for a list of ongoing crises. +figure.image-display + img(src='/resources/images/devguide/router/crisis-center-list.png' alt="Crisis Center List" width="250") +:marked + Select a crisis and the application takes you to a crisis editing screen. + The _Crisis Detail_ appears in a child view on the same page, beneath the list. + + Alter the name of a crisis. + Notice that the corresponding name in the crisis list does _not_ change. + +figure.image-display + img(src='/resources/images/devguide/router/crisis-center-detail.png' alt="Crisis Center Detail" width="250") +:marked + Unlike *Hero Detail*, which updates as you type, + *Crisis Detail* changes are temporary until you either save or discard them by pressing the "Save" or "Cancel" buttons. + Both buttons navigate back to the *Crisis Center* and its list of crises. + + ***Do not click either button yet***. + Click the browser back button or the "Heroes" link instead. + + Up pops a dialog box. +figure.image-display + img(src='/resources/images/devguide/router/confirm-dialog.png' alt="Confirm Dialog" width="250") + +:marked + You can say "OK" and lose your changes or click "Cancel" and continue editing. + + Behind this behavior is the router's `CanDeactivate` guard. + The guard gives you a chance to clean-up or ask the user's permission before navigating away from the current view. + + The `Admin` and `Login` buttons illustrate other router capabilities to be covered later in the guide. + This short introduction will do for now. + + Proceed to the first application milestone. + .l-main-section :marked ## Milestone #1: Getting Started with the Router - Let's begin with a simple version of the app that navigates between two empty views. + Begin with a simple version of the app that navigates between two empty views. figure.image-display - img(src='/resources/images/devguide/router/router-1-anim.gif' alt="App in action" ) + img(src='/resources/images/devguide/router/router-1-anim.gif' width="250px" alt="App in action" ) a#base-href :marked ### Set the *<base href>* The Router uses the browser's [history.pushState](https://developer.mozilla.org/en-US/docs/Web/API/History_API#Adding_and_modifying_history_entries) - for navigation. Thanks to `pushState`, we can make our in-app URL paths look the way we want them to - look, e.g. `localhost:3000/crisis-center`. Our in-app URLs can be indistinguishable from server URLs. + for navigation. Thanks to `pushState`, you can make in-app URL paths look the way you want them to + look, e.g. `localhost:3000/crisis-center`. The in-app URLs can be indistinguishable from server URLs. Modern HTML 5 browsers were the first to support `pushState` which is why many people refer to these URLs as "HTML 5 style" URLs. - We must **add a [<base href> element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base) tag** - to the `index.html` to make `pushState` routing work. - The browser also needs the base `href` value to prefix *relative* URLs when downloading and linking to - css files, scripts, and images. - - Add the base element just after the `` tag. - If the `app` folder is the application root, as it is for our application, - set the `href` value in **`index.html`** *exactly* as shown here. - -+makeExcerpt('index.1.html', 'base-href') - .l-sub-section :marked HTML 5 style navigation is the Router default. Learn why "HTML 5" style is preferred, how to adjust its behavior, and how to switch to the older hash (#) style if necessary in the [Browser URL Styles](#browser-url-styles) appendix below. +:marked + You must **add a [<base href> element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base) tag** + to the `index.html` to make `pushState` routing work. + The browser also needs the base `href` value to prefix *relative* URLs when downloading and linking to + css files, scripts, and images. + + Add the base element just after the `` tag. + If the `app` folder is the application root, as it is for this application, + set the `href` value in **`index.html`** *exactly* as shown here. + ++makeExcerpt('index.html', 'base-href') + :marked .l-sub-section :marked #### Live example note - We have to get tricky when we run the live example because the host service sets - the application base address dynamically. That's why we replace the `` with a - script that writes a `` tag on the fly to match. + A live coding environment like Plunker sets the application base address dynamically so you can't specify a fixed address. + That's why the example code replaces the `` with a script that writes the `` tag on the fly. code-example(format="") <script>document.write('<base href="' + document.location + '" />');</script> :marked - We should only need this trick for the live example, not production code. + You should only need this trick for the live example, not production code. a#import :marked ### Configure the routes for the Router - We begin by importing some symbols from the router library. + Begin by importing some symbols from the router library. The Router is in its own `@angular/router` package. It's not part of the Angular core. The router is an optional service because not all applications need routing and, depending on your requirements, you may need a different routing library. - We teach our router how to navigate by configuring it with routes. + You teach the router how to navigate by configuring it with routes. a#route-config h4#define-routes Define routes :marked A router must be configured with a list of route definitions. - Our first configuration defines an array of two routes with simple paths leading to the + The first configuration defines an array of two routes with simple paths leading to the `CrisisListComponent` and `HeroListComponent` components. Each definition translates to a [Route](../api/router/index/Route-interface.html) object which has a @@ -423,9 +409,9 @@ h4#define-routes Define routes `component`, the component associated with this route. The router draws upon its registry of such route definitions when the browser URL changes - or when our code tells the router to navigate along a route path. + or when application code tells the router to navigate along a route path. - In plain English, we might say of the first route: + In plain English, you might say of the first route: * *When the browser's location URL changes to match the path segment `/crisis-center`, create or retrieve an instance of the `CrisisListComponent` and display its view.* @@ -434,27 +420,26 @@ h4#define-routes Define routes for that path.* :marked - Here is our first configuration. We pass the array of routes to the `RouterModule.forRoot` method - which returns a module containing the configured `Router` service provider ... and some other, - unseen providers that the routing library requires. Once our application is bootstrapped, the `Router` - will perform the initial navigation based on the current browser URL. + Here is the first configuration. Pass the array of routes to the `RouterModule.forRoot` method. + It returns a module, containing the configured `Router` service provider, plus other providers that the routing library requires. + Once the application is bootstrapped, the `Router` performs the initial navigation based on the current browser URL. +makeExcerpt('app/app.module.1.ts', 'first-config') .l-sub-section :marked Adding the configured `RouterModule` to the `AppModule` is sufficient for simple route configurations. - As our application grows, we'll want to refactor our routing configuration into a separate file + As the application grows, you'll want to refactor the routing configuration into a separate file and create a **[Routing Module](#routing-module)**, a special type of `Service Module` dedicated for the purpose of routing in feature modules. :marked - Providing the `RouterModule` in our `AppModule` makes the Router available everywhere in our application. + Providing the `RouterModule` in the `AppModule` makes the Router available everywhere in the application. h3#shell The AppComponent shell :marked The root `AppComponent` is the application shell. It has a title at the top, a navigation bar with two links, - and a *Router Outlet* at the bottom where the router swaps views on and off the page. Here's what we mean: + and a *Router Outlet* at the bottom where the router swaps views on and off the page. Here's what you mean: figure.image-display img(src='/resources/images/devguide/router/shell-and-outlet.png' alt="Shell" width="300" ) @@ -468,51 +453,51 @@ a#router-outlet :marked ### *RouterOutlet* - `RouterOutlet` is a component from the router library. - The router displays views immediately ***after*** each ``'s corresponding closing tag. - + The `RouterOutlet` is a directive from the router library that marks + the spot in the template where the router should display the views for that outlet. .l-sub-section :marked - A template may hold exactly one ***unnamed*** ``. - The router supports multiple [named outlets](#named-outlets), covered later in the chapter. + It renders in the the DOM as a `` element. + The router inserts the outlet's view components as sibling elements, immediately _after_ the closing `` tag. a#router-link :marked ### *RouterLink* binding - Above the outlet, within the anchor tags, we see [Property Bindings](template-syntax.html#property-binding) to - the `RouterLink` directive that look like `routerLink="..."`. We use the `RouterLink` from the router library. + Above the outlet, within the anchor tags, you see [Property Bindings](template-syntax.html#property-binding) to + the `RouterLink` directive that look like `routerLink="..."`. The links in this example each have a string path, the path of a route that - we configured earlier. We don't have route parameters yet. + you configured earlier. There are no route parameters yet. - We can also add more contextual information to our `RouterLink` by providing query string parameters - or a URL fragment for jumping to different areas on our page. Query string parameters + You can also add more contextual information to the `RouterLink` by providing query string parameters + or a URL fragment for jumping to different areas on the page. Query string parameters are provided through the `[queryParams]` binding which takes an object (e.g. `{ name: 'value' }`), while the URL fragment takes a single value bound to the `[fragment]` input binding. .l-sub-section :marked - Learn about the how we can also use the **link parameters array** in the [appendix below](#link-parameters-array). + Learn about the how you can also use the _link parameters array_ in the [appendix below](#link-parameters-array). a#router-link-active h3#router-link RouterLinkActive binding :marked - On each anchor tag, we also see [Property Bindings](template-syntax.html#property-binding) to + On each anchor tag, you also see [Property Bindings](template-syntax.html#property-binding) to the `RouterLinkActive` directive that look like `routerLinkActive="..."`. - The template expression to the right of the equals (=) contains our space-delimited string of CSS classes. - We can also bind to the `RouterLinkActive` directive using an array of classes - such as `[routerLinkActive]="['...']"`. + The template expression to the right of the equals (=) contains a space-delimited string of CSS classes + that the Router will add when this link is active (and remove when the link is inactive). + You can also set the `RouterLinkActive` directive to a string of classes such as `[routerLinkActive]="active fluffy"` + or bind it to a component property that returns such a string. The `RouterLinkActive` directive toggles css classes for active `RouterLink`s based on the current `RouterState`. - This cascades down through each level in our route tree, so parent and child router links can be active at the same time. - To override this behavior, we can bind to the `[routerLinkActiveOptions]` input binding with the `{ exact: true }` expression. + This cascades down through each level of the route tree, so parent and child router links can be active at the same time. + To override this behavior, you can bind to the `[routerLinkActiveOptions]` input binding with the `{ exact: true }` expression. By using `{ exact: true }`, a given `RouterLink` will only be active if its URL is an exact match to the current URL. h3#router-directives Router Directives :marked `RouterLink`, `RouterLinkActive` and `RouterOutlet` are directives provided by the Angular `RouterModule` package. - They are readily available for us to use in our template. + They are readily available for you to use in the template. :marked The current state of `app.component.ts` looks like this: @@ -520,60 +505,119 @@ h3#router-directives Router Directives h3#wildcard-route Wildcard Routes :marked - We've created two routes in our app so far, one to `/crisis-center` and the other to `/heroes`. We also - want to handle routes that don't exist in our current configuration. This protects us against users - entering invalid URLs, and makes sure we display an appropriate page in those situations. The `Router` - handles invalid routes by using a **wildcard** route, which is used as a catch-all route for any - routes not previously matched by a `path` in our route setup. - - A `wildcard` route is configured with a **path** consisting of two asterisks. The `Router` will only match - this route if no other specific route has been found first. Wildcard routes can also be used to - [redirect](#redirect) to an existing route. + You've created two routes in the app so far, one to `/crisis-center` and the other to `/heroes`. + Any other URL causes the router to throw an error and crash the app. + + Add a **wildcard** route to intercept invalid URLs and handle them gracefully. + A _wildcard_ route has a path consisting of two asterisks. It matches _every_ URL. + The router will select _this_ route if it can't match a route earlier in the configuration. + A wildcard route can navigate to a custom "404 Not Found" component or [redirect](#redirect) to an existing route. .l-sub-section :marked - Wildcard routes are the least specific routes in the route configuration and should be included - last in the configuration, as the `Router` uses a [first match wins](#example-config) strategy. + The `Router` selects the route with a [_first match wins_](#example-config) strategy. + Wildcard routes are the least specific routes in the route configuration. + Be sure it is the _last_ route in the configuration. :marked - We'll add a `RouterLink` to our `/heroes` page that navigates `/sidekicks`. We have not - built our sidekicks page or route yet, but our `wildcard` route will catch any navigation - attempt to this page. - + To test this feature, add a button with a `RouterLink` to the `HeroListComponent` template and set the link to `"/sidekicks"`. +makeExcerpt('app/hero-list.component.ts') +:marked + The application will fail if the user clicks that button because you haven't defined a `"/sidekicks"` route yet. + + Instead of adding the `"/sidekicks"` route, define a `wildcard` route instead and have it navigate to a simple `PageNotFoundComponent`. ++makeExcerpt('app/app.module.1.ts', 'wildcard') :marked - We'll create a simple `PageNotFoundComponent` to display when our users visit invalid URLs. - + Create the `PageNotFoundComponent` to display when users visit invalid URLs. +makeExcerpt('app/not-found.component.ts (404 component)', '') :marked - We'll add a wildcard route to our configuration to serve a 404 page for any invalid URLs entered. - As with our other components, we'll add the `PageNotFoundComponent` to our `AppModule` declarations. + As with the other components, add the `PageNotFoundComponent` to the `AppModule` declarations. -+makeExcerpt('app/app.module.1.ts') + Now when the user visits `/sidekicks`, or any other invalid URL, the browser displays the "Page not found". + The browser address bar continues to point to the invalid URL. + + +a#default-route +:marked + ### The _default_ route to heroes + + When the application launches, the initial URL in the browser bar is something like: + +code-example. + localhost:3000 :marked - When the `/sidekicks` URL is visited, the browser URL will remain as `/sidekicks` but our 404 page will be displayed. + That doesn't match any of the configured routes which means that the application won't display any component when it's launched. + The user must click one of the navigation links to trigger a navigation and display something. + It would be nicer if the application had a **default route** that displayed the list of heroes immediately, + just as it will when the user clicks the "Heroes" link or pastes `localhost:3000/heroes/` into the address bar. + +a#redirect +:marked + ### Redirecting routes + + The preferred solution is to add a `redirect` route that translates from the initial relative URL (`''`) + to the desired default path (`/heroes`). The browser address bar shows `~/heroes` as if you'd navigated there directly. + + Add the default route somewhere _above_ the wildcard route. + It's just above the wildcard route in the following excerpt showing the complete `appRoutes` for this milestone. + ++makeExcerpt('app/app-routing.module.1.ts' , 'appRoutes') + +:marked + A redirect route requires a `pathMatch` property to tell the router how to match a URL to the path of a route. + The router throws an error if you don't. + In this app, the router should select the route to the `HeroListComponent` only when the *entire URL* matches `''`, + so set the `pathMatch` value to `'full'`. + +.l-sub-section + :marked + Technically, `pathMatch = 'full'` results in a route hit when the *remaining*, unmatched segments of the URL match `''`. + In this example, the redirect is in a top level route so the *remaining* URL and the *entire* URL are the same thing. + + The other possible `pathMatch` value is `'prefix'` which tells the router + to match the redirect route when the *remaining* URL ***begins*** with the redirect route's _prefix_ path. + + Don't do that here. + If the `pathMatch` value were `'prefix'`, _every_ URL would match `''`. + + Try setting it to `'prefix'` then click the `Go to sidekicks` button. + Remember that's a bad URL and you should see the "Page not found" page. + Instead, you're still on the "Heroes" page. + Enter a bad URL in the browser address bar. + You're instantly re-routed to `/heroes`. + _Every_ URL, good or bad, that falls through to _this_ route definition + will be a match. + + The default route should redirect to the `HeroListComponent` _only_ when the _entire_ url is `''`. + Remember to restore the redirect to `pathMatch = 'full'`. + + Learn more in Victor Savkin's + [post on redirects](http://victorsavkin.com/post/146722301646/angular-router-empty-paths-componentless-routes). + + A future update to this guide will cover redirects in more detail. :marked ### "Getting Started" wrap-up - We've got a very basic, navigating app, one that can switch between two views + You've got a very basic, navigating app, one that can switch between two views when the user clicks a link. - We've learned how to + You've learned how to * load the router library * add a nav bar to the shell template with anchor tags, `routerLink` and `routerLinkActive` directives * add a `router-outlet` to the shell template where views will be displayed * configure the router module with `RouterModule.forRoot` * set the router to compose "HTML 5" browser URLs * handle invalid routes with a `wildcard` route + * navigate to the default route when the app launches with an empty path The rest of the starter app is mundane, with little interest from a router perspective. Here are the details for readers inclined to build the sample through to this milestone. - Our starter app's structure looks like this: + The starter app's structure looks like this: .filetree .file router-sample .children @@ -614,50 +658,47 @@ h3#wildcard-route Wildcard Routes :marked ## Milestone #2: The *Routing Module* - In our initial route configuration, we provided a simple setup with two routes used - to configure our application for routing. This is perfectly fine for simple routing. - As our application grows and we make use of more *Router* features, such as guards, - resolvers, and child routing, we'll naturally want to refactor our routing. We - recommend moving the routing into a separate file using a special-purpose - service called a *Routing Module*. + In the initial route configuration, you provided a simple setup with two routes used + to configure the application for routing. This is perfectly fine for simple routing. + As the application grows and you make use of more `Router` features, such as guards, + resolvers, and child routing, you'll naturally want to refactor the routing configuration into its own file. + We recommend moving the routing information into a special-purpose module called a *Routing Module*. The **Routing Module** - * separates our routing concerns from our feature module - * provides a module to replace or remove when testing our feature module - * provides a common place for require routing service providers including guards and resolvers - * is **not** concerned with feature [module declarations](../cookbook/ngmodule-faq.html#routing-module) + * separates routing concerns from other application concerns + * provides a module to replace or remove when testing the application + * provides a well-known location for routing service providers including guards and resolvers + * does **not** [declare components](../cookbook/ngmodule-faq.html#routing-module) :marked - ### Refactor routing into a module + ### Refactor routing configuration into a _routing module_ - We'll create a file named `app-routing.module.ts` in our `/app` folder to - contain our `Routing Module`. The routing module will import our `RouterModule` tokens - and configure our routes. We'll follow the convention of our filename and name - the Angular module `AppRoutingModule`. + Create a file named `app-routing.module.ts` in the `/app` folder to contain the routing module. - We import the `CrisisListComponent` and the `HeroListComponent` components - just like we did in the `app.module.ts`. Then we'll move the `Router` imports - and routing configuration including `RouterModule.forRoot` into our routing module. - - We'll also export the `AppRoutingModule` so we can add it to our `AppModule` imports. - - Our last step is to re-export the `RouterModule`. By re-exporting the `RouterModule`, - our feature module will be provided with the `Router Directives` when using our `Routing Module`. - - Here is our first `Routing Module`: - -+makeExcerpt('app/app-routing.module.1.ts') :marked - Next, we'll update our `app.module.ts` file by importing our `AppRoutingModule` token - from the `app-routing.module.ts` and replace our `RouterModule.forRoot` with our newly - created `AppRoutingModule`. + Import the `CrisisListComponent` and the `HeroListComponent` components + just like you did in the `app.module.ts`. Then move the `Router` imports + and routing configuration, including `RouterModule.forRoot`, into this routing module. -+makeExcerpt('app/app.module.2.ts') + Following convention, add a class name `AppRoutingModule` and export it + so you can import it later in `AppModule`. + + Finally, re-export the Angular `RouterModule` by adding it to the module `exports` array. + By re-exporting the `RouterModule` here and importing `AppRouterModule` in `AppModule`, + the components declared in `AppModule` will have access to router directives such as `RouterLink` and `RouterOutlet`. + + After these steps, the file should look like this. ++makeExample('app/app-routing.module.1.ts') +:marked + Next, update the `app.module.ts` file, + first importing the new-created `AppRoutingModule`from `app-routing.module.ts`, + then replacing `RouterModule.forRoot` in the `imports` array with the `AppRoutingModule`. ++makeExample('app/app.module.2.ts') :marked - Our application continues to work just the same, and we can use our routing module as - the central place to maintain our routing configuration for each feature module. + The application continues to work just the same, and you can use `AppRoutingModule` as + the central place to maintain future routing configuration. a#why-routing-module :marked @@ -685,29 +726,29 @@ a#why-routing-module :marked ## Milestone #3: The Heroes Feature - We've seen how to navigate using the `RouterLink` directive. + You've seen how to navigate using the `RouterLink` directive. - Now we'll learn some new tricks such as how to - * organize our app and routes into *feature areas* using modules + Now you'll learn some new tricks such as how to + * organize the app and routes into *feature areas* using modules * navigate imperatively from one component to another * pass required and optional information in route parameters - To demonstrate, we'll build out the *Heroes* feature. + To demonstrate, you'll build out the *Heroes* feature. ### The Heroes "feature area" A typical application has multiple *feature areas*, each an island of functionality with its own workflow(s), dedicated to a particular business purpose. - We could continue to add files to the `app/` folder. + You could continue to add files to the `app/` folder. That's unrealistic and ultimately not maintainable. - We think it's better to put each feature area in its own folder. + Most developers prefer to put each feature area in its own folder. - Our first step is to **create a separate `app/heroes/` folder** + The first step is to **create a separate `app/heroes/` folder** and add *Hero Management* feature files there. - We won't be creative about it. Our example is pretty much a - copy of the code and capabilities in the "[Tutorial: Tour of Heroes](../tutorial/index.html)". + This example is pretty much a copy of the code and capabilities in the "[Tutorial: Tour of Heroes](../tutorial/index.html)". + There's not need to be more creative. Here's how the user will experience this version of the app figure.image-display @@ -715,27 +756,27 @@ figure.image-display :marked ### Add Heroes functionality - We want to break our app out into different *feature modules* that we then import - into our main module so it can make use of them. First, we'll create a `heroes.module.ts` - in our heroes folder. + You are about to break up the app into different *feature modules*, each focused on its own concerns. + Then you'll import into the main module and navigate among them. - We delete the placeholder `hero-list.component.ts` that's in - the `app/` folder. + First, create a `heroes.module.ts` in the heroes folder. - We create a new `hero-list.component.ts` in the `app/heroes/` - folder and copy over the contents of the final `heroes.component.ts` from the tutorial. - We copy the `hero-detail.component.ts` and the `hero.service.ts` files - into the `heroes/` folder. + Delete the placeholder `hero-list.component.ts` that's in the `app/` folder. - We provide the `HeroService` in the `providers` array of our `Heroes` module - so its available to all components within our module. + Create a new `hero-list.component.ts` in the `app/heroes/` + folder and copy into it the contents of the final `heroes.component.ts` from the tutorial. - Our `Heroes` module is ready for routing. + Copy the `hero-detail.component.ts` and the `hero.service.ts` files into the `heroes/` folder. + + Add the `HeroService` to the `providers` array of the `Heroes` module + so its available to all components within the module. + + The `Heroes` module is ready for routing. +makeExcerpt('app/heroes/heroes.module.1.ts') :marked - When we're done organizing, we have four *Hero Management* files: + When you're done organizing, you have four *Hero Management* files: .filetree .file app/heroes @@ -747,52 +788,56 @@ figure.image-display :marked Now it's time for some surgery to bring these files and the rest of the app - into alignment with our application router. + into alignment with the application router. ### *Hero* feature routing requirements The new Heroes feature has two interacting components, the list and the detail. - The list view is self-sufficient; we navigate to it, it gets a list of heroes and displays them. + The list view is self-sufficient; you navigate to it, it gets a list of heroes and displays them. It doesn't need any outside information. - The detail view is different. It displays a particular hero. It can't know which hero on its own. + The detail view is different. It displays a particular hero. It can't know which hero to show on its own. That information must come from outside. - In our example, when the user selects a hero from the list, we navigate to the detail view to show that hero. - We'll tell the detail view which hero to display by including the selected hero's id in the route URL. + In this example, when the user selects a hero from the list, you navigate to the detail view to show that hero. + You tell the detail view which hero to display by including the selected hero's id in the route URL. ### *Hero* feature route configuration - We recommend giving each feature area its own route configuration file. - - Create a new `heroes-routing.module.ts` in the `heroes` folder like this: + Create a new `heroes-routing.module.ts` in the `heroes` folder + using the same techniques you learned while creating the `AppRoutingModule`. +makeExcerpt('app/heroes/heroes-routing.module.ts') .l-sub-section :marked - Keep the Routing Module file in the same folder as its companion module file. + Put the Routing Module file in the same folder as its companion module file. Here both `heroes-routing.module.ts` and `heroes.module.ts` are in the same `app/heroes` folder. -:marked - We use the same techniques we learned in creating the `app-routing.module.ts`. - - We import the two components from their new locations in the `app/heroes/` folder, define the two hero routes. - and add export our `HeroRoutingModule` that returns our `RoutingModule` for the hero feature module. + We recommend giving each feature module its own route configuration file. + It may seem like overkill early when the feature routes are simple. + But routes have a tendency to grow more complex and consistency in patterns pays off over time. :marked - Now that we have routes for our `Heroes` module, we'll need to register them with the *Router*. - We'll import the *RouterModule* like we did in the `app-routing.module.ts`, but there is a slight difference here. - In our `app-routing.module.ts`, we used the static **forRoot** method to register our routes and application level - service providers. In a feature module we use static **forChild** method. + Import the hero components from their new locations in the `app/heroes/` folder, define the two hero routes. + and export the `HeroRoutingModule` class. + + Now that you have routes for the `Heroes` module, register them with the `Router` via the + `RouterModule` _almost_ as you did in the `AppRoutingModule`. + + There is a small but critical difference. + In the `AppRoutingModule`, you used the static `RouterModule.`**`forRoot`** method to register the routes and application level service providers. + In a feature module you use static **`forChild`** method. .l-sub-section :marked - The **RouterModule.forRoot** should only be provided for the `AppModule`. Since we are in a feature - module, we'll use **RouterModule.forChild** method to only register additional routes. + Only call `RouterModule.forRoot` in the root `AppRoutingModule` + (or the `AppModule` if that's where you register top level application routes). + In any other module, you must call the `RouterModule.`**`forChild`** method to register additional routes. :marked - We import our `HeroRoutingModule` token from `heroes-routing.module.ts` into our `Heroes` module and register the routing. + Import the `HeroRoutingModule` token from `heroes-routing.module.ts` into the `HeroesModule`, + just as you imported `AppRoutingModule` into the `AppModule`. +makeExcerpt('app/heroes/heroes.module.ts (heroes routing)', 'heroes-routes') @@ -804,9 +849,9 @@ figure.image-display :marked Notice the `:id` token in the path. That creates a slot in the path for a **Route Parameter**. - In this case, we're expecting the router to insert the `id` of a hero into that slot. + In this case, you're expecting the router to insert the `id` of a hero into that slot. - If we tell the router to navigate to the detail component and display "Magneta", we expect hero `id` (15) to appear in the + If you tell the router to navigate to the detail component and display "Magneta", you expect hero `id` (15) to appear in the browser URL like this: code-example(format="." language="bash"). localhost:3000/hero/15 @@ -816,56 +861,56 @@ code-example(format="." language="bash"). .l-sub-section :marked #### Route parameter: Required or optional? - Embedding the route parameter token, `:id`, in the route definition path is a good choice for our scenario + Embedding the route parameter token, `:id`, in the route definition path is a good choice for this scenario because the `id` is *required* by the `HeroDetailComponent` and because the value `15` in the path clearly distinguishes the route to "Magneta" from a route for some other hero. - An [optional-route-parameter](#optional-route-parameters) might be a better choice if we were passing an *optional* value to `HeroDetailComponent`. + An [optional-route-parameter](#optional-route-parameters) might be a better choice if you were passing an *optional* value to `HeroDetailComponent`. a#navigate :marked ### Navigate to hero detail imperatively - *We won't navigate to the detail component by clicking a link* - so we won't be adding a new `RouterLink` anchor tag to the shell. + *Users won't navigate to the detail component by clicking a link* + so you won't be adding a new `RouterLink` anchor tag to the shell. - Instead, when the user *clicks* a hero in the list, we'll *command* the router + Instead, when the user *clicks* a hero in the list, you'll *command* the router to navigate to the hero detail view for the selected hero. - We'll adjust the `HeroListComponent` to implement these tasks, beginning with its constructor - which acquires the router service and the `HeroService` by dependency injection: + Start in the `HeroListComponent`. + Revise its constructor so that it acquires the `Router` and the `HeroService` by dependency injection: +makeExcerpt('app/heroes/hero-list.component.1.ts (constructor)', 'ctor') :marked - We make a few changes to the template: + Make the following few changes to the component's template: +makeExcerpt('app/heroes/hero-list.component.1.ts', 'template', '') :marked - The template defines an `*ngFor` repeater such as [we've seen before](displaying-data.html#ngFor). + The template defines an `*ngFor` repeater such as [you've seen before](displaying-data.html#ngFor). There's a `(click)` [EventBinding](template-syntax.html#event-binding) to the component's `onSelect` method - which we implement as follows: + which you implement as follows: +makeExcerpt('app/heroes/hero-list.component.1.ts', 'select') :marked - It calls the router's **`navigate`** method with a **Link Parameters Array**. We can use this same syntax - with a `RouterLink` if we want to use it in HTML rather than code. + The component's `onSelect` calls the router's **`navigate`** method with a _link parameters array_. + You can use this same syntax in a `RouterLink` if you decide later to navigate in HTML template rather than in component code. h3#route-parameters Setting the route parameters in the list view :marked - We're navigating to the `HeroDetailComponent` where we expect to see the details of the selected hero. - We'll need *two* pieces of information: the destination and the hero's `id`. + After navigating to the `HeroDetailComponent`, you expect to see the details of the selected hero. + You'll need *two* pieces of information: the routing path to the component and the hero's `id`. - Accordingly, the *link parameters array* has *two* items: the **path** of the destination route and a **route parameter** that specifies the + Accordingly, the _link parameters array_ has *two* items: the routing _path_ and a _route parameter_ that specifies the `id` of the selected hero. +makeExcerpt('app/heroes/hero-list.component.1.ts', 'link-parameters-array') :marked - The router composes the appropriate two-part destination URL from this array: + The router composes the following two-part URL from this array: code-example(language="bash"). localhost:3000/hero/15 @@ -878,7 +923,7 @@ a#get-route-parameter Certainly not by analyzing the URL! That's the router's job. The router extracts the route parameter (`id:15`) from the URL and supplies it to - the `HeroDetailComponent` via the **ActivatedRoute** service. + the `HeroDetailComponent` via the `ActivatedRoute` service. h3#activated-route ActivatedRoute: the one-stop-shop for route information @@ -901,7 +946,7 @@ h3#activated-route ActivatedRoute: the one-stop-shop for route information **`fragment`**: An `Observable` of the URL [fragment](#fragment) available to all routes. - **`outlet`**: The name of the `RouterOutlet` used to render the route. For an unnamed outlet, the outlet name is **primary**. + **`outlet`**: The name of the `RouterOutlet` used to render the route. For an unnamed outlet, the outlet name is _primary_. **`routeConfig`**: The route configuration used for the route that contains the origin path. @@ -912,96 +957,105 @@ h3#activated-route ActivatedRoute: the one-stop-shop for route information **`children`**: contains all the [child routes](#child-routing-component) activated under the current route. :marked - We import the `Router`, `ActivatedRoute`, and `Params` tokens from the router package. + Import the `Router`, `ActivatedRoute`, and `Params` tokens from the router package. +makeExcerpt('app/heroes/hero-detail.component.1.ts (activated route)', 'imports') :marked - We import the `switchMap` operator because we need it later to process the `Observable` route parameters. + Import the `switchMap` operator because you need it later to process the `Observable` route parameters. -+makeExcerpt('app/heroes/hero-detail.component.1.ts (switchMap operator import)', 'rxjs-operator-import') ++makeExcerpt('app/heroes/hero-detail.component.ts (switchMap operator import)', 'rxjs-operator-import') a#hero-detail-ctor :marked - As usual, we write a constructor that asks Angular to inject services + As usual, you write a constructor that asks Angular to inject services that the component requires and reference them as private variables. +makeExcerpt('app/heroes/hero-detail.component.ts (constructor)', 'ctor') :marked - Later, in the `ngOnInit` method, we use the `ActivatedRoute` service to retrieve the parameters - for our route. Since our parameters are provided as an `Observable`, we use the _switchMap_ operator to - provide them for the `id` parameter by name and tell the `HeroService` to fetch the hero with that `id`. + Later, in the `ngOnInit` method, you use the `ActivatedRoute` service to retrieve the parameters for the route, + pull the hero `id` from the parameters and retrieve the hero to display. + +.l-sub-section + :marked + Put this data access logic in the `ngOnInit` method rather than inside the constructor to improve the component's testability. + Angular calls the `ngOnInit` method shortly after creating an instance of the `HeroDetailComponent` + so the hero will be retrieved in time to use it. + + Learn more about the `ngOnInit` method and other component lifecycle hooks in the [Lifecycle Hooks](lifecycle-hooks.html) guide. +makeExcerpt('app/heroes/hero-detail.component.ts (ngOnInit)', 'ngOnInit') -.l-sub-section - :marked - The `switchMap` operator allows you to perform an action with the current value of the `Observable`, - and map it to a new `Observable`. As with many `rxjs` operators, `switchMap` handles - an `Observable` as well as a `Promise` to retrieve the value they emit. +:marked + Since the parameters are provided as an `Observable`, you use the _switchMap_ operator to + provide them for the `id` parameter by name and tell the `HeroService` to fetch the hero with that `id`. - The `switchMap` operator will also cancel any in-flight requests if our user re-navigates to the route - while still retrieving a hero. Our `Observable` is _cold_ until subscribed to, so we use the `subscribe` method - to get and set our retrieved `Hero`. + The `switchMap` operator allows you to perform an action with the current value of the `Observable`, + and map it to a new `Observable`. As with many `rxjs` operators, `switchMap` handles + an `Observable` as well as a `Promise` to retrieve the value they emit. -.l-sub-section - :marked - Angular calls the `ngOnInit` method shortly after creating an instance of the `HeroDetailComponent`. - - We put the data access logic in the `ngOnInit` method rather than inside the constructor - to improve the component's testability. - We explore this point in greater detail in the [OnInit appendix](#onInit) below. - -.l-sub-section - :marked - Learn about the `ngOnInit` method in the - [Lifecycle Hooks](lifecycle-hooks.html) chapter. + The `switchMap` operator will also cancel any in-flight requests if the user re-navigates to the route + while still retrieving a hero. + + Use the `subscribe` method to detect `id` changes and to (re)set the retrieved `Hero`. h4#reuse Observable params and component re-use :marked - In this example, we retrieve the route params from an `Observable`. + In this example, you retrieve the route params from an `Observable`. That implies that the route params can change during the lifetime of this component. - They might. By default, the router reuses a component instance when it re-navigates to the same component type - without visiting a different component first. The parameters can change between each re-use. + They might. By default, the router re-uses a component instance when it re-navigates to the same component type + without visiting a different component first. The route parameters could change each time. Suppose a parent component navigation bar had "forward" and "back" buttons that scrolled through the list of heroes. Each click navigated imperatively to the `HeroDetailComponent` with the next or previous `id`. - We don't want the router to remove the current `HeroDetailComponent` instance from the - DOM only to re-create it for the next `id`. + You don't want the router to remove the current `HeroDetailComponent` instance from the DOM only to re-create it for the next `id`. That could be visibly jarring. Better to simply re-use the same component instance and update the parameter. - But `ngOnInit` is only called once per instantiation. - We need a way to detect when the route parameters change from _within the same instance_. + Unfortunately, `ngOnInit` is only called once per component instantiation. + You need a way to detect when the route parameters change from _within the same instance_. The observable `params` property handles that beautifully. -h4#snapshot Snapshot: the no-observable alternative +.l-sub-section + :marked + When subscribing to an observable in a component, you almost always arrange to unsubscribe when the component is destroyed. + + There are a few exceptional observables where this is not necessary. + The `ActivatedRoute` observables are among the exceptions. + + The `ActivatedRoute` and its observables are insulated from the `Router` itself. + The `Router` destroys a routed component when it is no longer needed and the injected `ActivatedRoute` dies with it. + + Feel free to unsubscribe anyway. It is harmless and never a bad practice. + +a#snapshot :marked - This application won't reuse the `HeroDetailComponent`. - We always return to the hero list to select another hero to view. - There's no way to navigate from hero detail to hero detail + #### _Snapshot_: the _no-observable_ alternative + _This_ application won't re-use the `HeroDetailComponent`. + The user always returns to the hero list to select another hero to view. + There's no way to navigate from one hero detail to another hero detail without visiting the list component in between. - That means we get a new `HeroDetailComponent` instance every time. + Therefore, the router creates a new `HeroDetailComponent` instance every time. - Suppose we know for certain that `HeroDetailComponent` will *never, never, ever* - be re-used. We'll always re-create the component each time we navigate to it. + When you know for certain that a `HeroDetailComponent` instance will *never, never, ever* + be re-used, you can simplify the code with the *snapshot*. - The router offers a *Snapshot* alternative that gives us the initial value of the route parameters. - We don't need to subscribe or unsubscribe. + The `route.snapshot` provides the initial value of the route parameters. + You can access the parameters directly without subscribing or adding observable operators. It's much simpler to write and read: +makeExcerpt('app/heroes/hero-detail.component.2.ts (ngOnInit snapshot)', 'snapshot') .l-sub-section :marked - **Remember:** we only get the _initial_ value of the parameters with this technique. - Stick with the observable `params` approach if there's even a chance that we might navigate - to this component multiple times in a row. - We are leaving the observable `params` strategy in place just in case. + **Remember:** you only get the _initial_ value of the parameters with this technique. + Stick with the observable `params` approach if there's even a chance that the router + could re-use the component. + This sample stays with the observable `params` strategy just in case. a#nav-to-list :marked @@ -1010,9 +1064,9 @@ a#nav-to-list The `HeroDetailComponent` has a "Back" button wired to its `gotoHeroes` method that navigates imperatively back to the `HeroListComponent`. - The router `navigate` method takes the same one-item *link parameters array* - that we can bind to a `[routerLink]` directive. - It holds the **path to the `HeroListComponent`**: + The router `navigate` method takes the same one-item _link parameters array_ + that you can bind to a `[routerLink]` directive. + It holds the _path to the `HeroListComponent`_: +makeExcerpt('app/heroes/hero-detail.component.1.ts (excerpt)', 'gotoHeroes') @@ -1020,32 +1074,32 @@ a#nav-to-list :marked ### Route Parameters - We use [*route parameters*](#route-parameters) to specify a *required* parameter value *within* the route URL - as we do when navigating to the `HeroDetailComponent` in order to view-and-edit the hero with *id:15*. + Use [*route parameters*](#route-parameters) to specify a *required* parameter value *within* the route URL + as you do when navigating to the `HeroDetailComponent` in order to view-and-edit the hero with *id:15*. code-example(format="." language="bash"). localhost:3000/hero/15 :marked - Sometimes we wish to add *optional* information to a route request. + Sometimes you wish to add *optional* information to a route request. For example, the `HeroListComponent` doesn't need help to display a list of heroes. But it might be nice if the previously-viewed hero were pre-selected when returning from the `HeroDetailComponent`. figure.image-display img(src='/resources/images/devguide/router/selected-hero.png' alt="Selected hero") :marked - That becomes possible if we can include hero Magneta's `id` in the URL when we - return from the `HeroDetailComponent`, a scenario we'll pursue in a moment. + That becomes possible if you can include hero Magneta's `id` in the URL when you + return from the `HeroDetailComponent`, a scenario you'll pursue in a moment. Optional information takes other forms. Search criteria are often loosely structured, e.g., `name='wind*'`. Multiple values are common — `after='12/31/2015' & before='1/1/2017'` — in no particular order — `before='1/1/2017' & after='12/31/2015'` — in a variety of formats — `during='currentYear'` . - These kinds of parameters don't fit easily in a URL *path*. Even if we could define a suitable URL token scheme, + These kinds of parameters don't fit easily in a URL *path*. Even if you could define a suitable URL token scheme, doing so greatly complicates the pattern matching required to translate an incoming URL to a named route. Optional parameters are the ideal vehicle for conveying arbitrarily complex information during navigation. Optional parameters aren't involved in pattern matching and afford enormous flexibility of expression. The Router supports navigation with optional parameters as well as required route parameters. - We define _optional_ parameters in an *object* after we define our required route parameters. + Define _optional_ parameters in a separate object _after_ you define the required route parameters. ### Route Parameters: Required or Optional? @@ -1061,35 +1115,35 @@ figure.image-display ### Route parameter - When navigating to the `HeroDetailComponent` we specified the _required_ `id` of the hero-to-edit in the - *route parameter* and made it the second item of the [*link parameters array*](#link-parameters-array). + When navigating to the `HeroDetailComponent` you specified the _required_ `id` of the hero-to-edit in the + *route parameter* and made it the second item of the [_link parameters array_](#link-parameters-array). +makeExcerpt('app/heroes/hero-list.component.1.ts', 'link-parameters-array') :marked - The router embedded the `id` value in the navigation URL because we had defined it + The router embedded the `id` value in the navigation URL because you had defined it as a route parameter with an `:id` placeholder token in the route `path`: +makeExcerpt('app/heroes/heroes-routing.module.ts', 'hero-detail-route') :marked - When the user clicks the back button, the `HeroDetailComponent` constructs another *link parameters array* + When the user clicks the back button, the `HeroDetailComponent` constructs another _link parameters array_ which it uses to navigate back to the `HeroListComponent`. +makeExcerpt('app/heroes/hero-detail.component.1.ts', 'gotoHeroes') :marked - This array lacks a route parameter because we had no reason to send information to the `HeroListComponent`. + This array lacks a route parameter because you had no reason to send information to the `HeroListComponent`. - Now we have a reason. We'd like to send the id of the current hero with the navigation request so that the + Now you have a reason. You'd like to send the id of the current hero with the navigation request so that the `HeroListComponent` can highlight that hero in its list. This is a _nice-to-have_ feature; the list will display perfectly well without it. - We do that with an object that contains an _optional_ `id` parameter. - For demonstration purposes, we also defined a junk parameter (`foo`) that the `HeroListComponent` should ignore. + Send the `id` with an object that contains an _optional_ `id` parameter. + For demonstration purposes, there's an extra junk parameter (`foo`) in the object that the `HeroListComponent` should ignore. Here's the revised navigation statement: -+makeExcerpt('app/heroes/hero-detail.component.ts (go to heroes)', 'gotoHeroes-navigate') ++makeExcerpt('app/heroes/hero-detail.component.ts (go to heroes)', 'gotoHeroes') :marked The application still works. Clicking "back" returns to the hero list view. @@ -1110,7 +1164,7 @@ code-example(language="bash"). The optional route parameters are not separated by "?" and "&" as they would be in the URL query string. They are **separated by semicolons ";"** - This is *matrix URL* notation — something we may not have seen before. + This is *matrix URL* notation — something you may not have seen before. .l-sub-section :marked @@ -1122,7 +1176,7 @@ code-example(language="bash"). belonging to parent and child routes. The Router is such a system and provides support for the matrix notation across browsers. - The syntax may seem strange to us but users are unlikely to notice or care + The syntax may seem strange to you but users are unlikely to notice or care as long as the URL can be emailed and pasted into a browser address bar as this one can. @@ -1134,36 +1188,36 @@ code-example(language="bash"). .l-sub-section :marked The *does* highlight the selected - row because it demonstrates the final state of the application which includes the steps we're *about* to cover. - At the moment we're describing the state of affairs *prior* to those steps. + row because it demonstrates the final state of the application which includes the steps you're *about* to cover. + At the moment you're describing the state of affairs *prior* to those steps. :marked The `HeroListComponent` isn't expecting any parameters at all and wouldn't know what to do with them. - Let's change that. + You can change that. Previously, when navigating from the `HeroListComponent` to the `HeroDetailComponent`, - we subscribed to the route params `Observable` and made it available to the `HeroDetailComponent` - in the `ActivatedRoute` service. We injected that service in the constructor of the `HeroDetailComponent`. + you subscribed to the route params `Observable` and made it available to the `HeroDetailComponent` + in the `ActivatedRoute` service. + You injected that service in the constructor of the `HeroDetailComponent`. - This time we'll be navigating in the opposite direction, from the `HeroDetailComponent` to the `HeroListComponent`. + This time you'll be navigating in the opposite direction, from the `HeroDetailComponent` to the `HeroListComponent`. - First we extend the router import statement to include the `ActivatedRoute` service symbol; + First you extend the router import statement to include the `ActivatedRoute` service symbol; +makeExcerpt('app/heroes/hero-list.component.ts (import)', 'import-router') :marked - We'll import the `switchMap` operator to perform an operation on our `Observable` - of route parameters. + Import the `switchMap` operator to perform an operation on the `Observable` of route parameters. +makeExcerpt('app/heroes/hero-list.component.ts (rxjs imports)', 'rxjs-imports') :marked - Then we inject the `ActivatedRoute` in the `HeroListComponent` constructor. + Then you inject the `ActivatedRoute` in the `HeroListComponent` constructor. +makeExcerpt('app/heroes/hero-list.component.ts (constructor and ngOnInit)', 'ctor') :marked The ActivatedRoute.params property is an Observable of route parameters. The params emits new id values - when the user navigates to the component. In ngOnInit we subscribe to those values, set the selectedId, + when the user navigates to the component. In ngOnInit you subscribe to those values, set the selectedId, and get the heroes. .l-sub-section @@ -1171,12 +1225,12 @@ code-example(language="bash"). All route/query parameters are strings. The (+) in front of the `params['id']` expression is a JavaScript trick to convert the string to an integer. :marked - We add an `isSelected` method that returns true when a hero's id matches the selected id. + Add an `isSelected` method that returns true when a hero's id matches the selected id. +makeExcerpt('app/heroes/hero-list.component.ts', 'isSelected') :marked - Finally, we update our template with a [Class Binding](template-syntax.html#class-binding) to that `isSelected` method. + Finally, you update the template with a [Class Binding](template-syntax.html#class-binding) to that `isSelected` method. The binding adds the `selected` CSS class when the method returns `true` and removes it when `false`. Look for it within the repeated `
  • ` tag as shown here: @@ -1189,93 +1243,96 @@ figure.image-display :marked The optional `foo` route parameter is harmless and continues to be ignored. -h3#route-animation Adding animations to the route component +h3#route-animation Adding animations to the routed component :marked - Our heroes feature module is almost complete, but what is a feature without some smooth transitions? - We already know that Angular supports [animations](../guide/animations.html) and we want to take - advantage of them by adding some animation to our *Hero Detail* component. + The heroes feature module is almost complete, but what is a feature without some smooth transitions? - First, we'll start by importing our animation functions that build our animation triggers, - control state and manage transitions between states. We'll use these functions to add transitions - to our route component as it moves between states our application view. We'll also import the - `HostBinding` decorator for binding to our route component. + In this section you'll add some [animations](../guide/animations.html) to the *Hero Detail* component. -+makeExcerpt('app/heroes/hero-detail.component.ts (animation imports)', 'route-animation-imports') + Create an `animations.ts` file in the root `app/` folder. The contents look like this: ++makeExcerpt('app/animations.ts', '', 'app/animations.ts') +:marked + This file does the following: + + * Imports the animation symbols that build the animation triggers, control state, and manage transitions between states. + + * Exports a constant named `slideInDownAnimation` set to an animation trigger named *routeAnimation*; + animated components will refer to this name. + + * Specifies the _wildcard state_ that matches any animation state that the route component is in. + + * Defines two *transitions*, one to ease the component in from the left of the screen as it enters the application view (`:enter`), + the other to animate the component down as it leaves the application view (`:leave`). + + You could create more triggers with different transitions for other route components. This trigger is sufficient for the current milestone. :marked - Next, we'll use a **host binding** for route animations named *@routeAnimation*. There is nothing special - about the choice of the binding name, but since we are controlling route animation, we'll go with `routeAnimation`. - The binding value is set to `true` because we only care about the `:enter` and `:leave` states which are - [entering and leaving](../api/core/index/transition-function.html#transition-aliases-enter-and-leave-) transition aliases. + Back in the `HeroDetailComponent`, import the `slideInDownAnimation` from `'./animations.ts`. + Add the `HostBinding` decorator to the imports from `@angular/core`; you'll need it in a moment. - We'll also add some display and positioning bindings for styling. - -+makeExcerpt('app/heroes/hero-detail.component.ts (route animation binding)', 'route-animation-host-binding') + Add an `animations` array to the `@Component` metadata's that contains the `slideInDownAnimation`. + Then add three `@HostBinding` properties to the class to set the animation and styles for the route component's element. ++makeExcerpt('app/heroes/hero-detail.component.ts (host bindings)', 'host-bindings') :marked - Now we can build our animation trigger, which we'll call *routeAnimation* to match the binding we previously - setup. We'll use the **wildcard state** that matches any animation state our route component is in, along with - two *transitions*. One transition animates the component as it enters the application view (`:enter`), while the other - animates the component as it leaves the application view (`:leave`). + The `'@routeAnimation'` passed to the first `@HostBinding` matches the name of the `slideInDownAnimation` _trigger_. + Set the `routeAnimation` property to `true` because you only care about the `:enter` and `:leave` states. - We could add different transitions to different route components depending on our needs. We'll just animate our `HeroDetailComponent` for this milestone. + The other two `@HostBinding` properties style the display and position of the component. + + The `HeroDetailComponent` will ease in from the left when routed to and will slide down when navigating away. .l-sub-section :marked - Using route animations on individual components is something we don't want to do throughout our entire application. - It would be better to animate routes based on **route paths**, a topic to cover in a future update to this chapter. - -:marked - Our route component animation looks as such: - -+makeExcerpt('app/heroes/hero-detail.component.ts (route animation)', 'route-animation') - -:marked - Simply stated, our `HeroDetailComponent` will ease in from the left when routed to and will slide down when navigating away. - We could add more complex animations here, but we'll leave our `HeroDetailComponent` as is for now. + Applying route animations to individual components is something you'd rather not do throughout the entire application. + It would be better to animate routes based on _route paths_, a topic to cover in a future update to this guide. h3#merge-hero-routes Import hero module into AppModule :marked - Our heroes feature module is ready, but application doesn't know about our heroes module yet. - We'll need to import it into the `AppModule` we defined in `app.module.ts`. + The heroes feature module is ready, but the application doesn't know about the `HeroesModule` yet. + Open `app.module.ts` and revise it as follows. + + Import the `HeroesModule` and add it to the `imports` array in the `@NgModule` metadata of the `AppModule` + + Remove the `HeroListComponent` from the `AppModule`'s `declarations` because it's now provided by the `HeroesModule`. + This is important. There can be only _one_ owner for a declared component. + In this case, the `Heroes` module is the owner of the `Heroes` components and is making them available to + components in the `AppModule` via the `HeroesModule`. + + After these steps, the `AppModule` should look like this: - Update `app.module.ts` as follows: - -+makeExcerpt('app/app.module.3.ts (heroes module import)', 'hero-import') ++makeExcerpt('app/app.module.3.ts') :marked - We imported the `HeroesModule` and added it to our `AppModule`'s `imports`. - - We removed the `HeroListComponent` from the `AppModule`'s `declarations` because its being provided by the `HeroesModule` - now. This is important because there can be only **one** owner for a declared component. In our case, the `Heroes` module is - the owner of the `Heroes` components and is making them available to the `AppModule`. .l-sub-section :marked - Routes provided by feature modules will be combined together into their imported module's routes by - the router. This allows us to continue defining our feature module routes without - modifying our main route configuration. + Routes provided by feature modules are combined together into their imported module's routes by the router. + This allows you to continue defining the feature module routes without modifying the main route configuration. :marked As a result, the `AppModule` no longer has specific knowledge of the hero feature, its components, or its route details. - We can evolve the hero feature with more components and different routes. + You can evolve the hero feature with more components and different routes. That's a key benefit of creating a separate module for each feature area. - Since our `Heroes` routes are defined within our feature module, we can also remove our initial `heroes` route from the `app-routing.module.ts`. + Since the `Heroes` routes are defined within the feature module, you can also remove the initial `heroes` route from the `app-routing.module.ts`. + + But leave the default and the wildcard routes! + These are concerns at the top level of the application itself. +makeExcerpt('app/app-routing.module.2.ts (v2)', '') :marked ### Heroes App Wrap-up - We've reached the second milestone in our router education. + You've reached the second milestone in your router education. - We've learned how to - * organize our app into *feature areas* + You've learned how to + * organize the app into *feature areas* * navigate imperatively from one component to another - * pass information along in route parameters and subscribe to them in our component - * import our feature area NgModule into our `AppModule` - * apply animations to our route component + * pass information along in route parameters and subscribe to them in the component + * import the feature area NgModule into the `AppModule` + * apply animations to the route component After these changes, the folder structure looks like this: .filetree @@ -1308,13 +1365,13 @@ h3#merge-hero-routes Import hero module into AppModule +makeTabs( `router/ts/app/app.component.1.ts, router/ts/app/app.module.3.ts, - router/ts/app/app-routing.module.3.ts, + router/ts/app/app-routing.module.2.ts, router/ts/app/heroes/hero-list.component.ts, router/ts/app/heroes/hero-detail.component.ts, router/ts/app/heroes/hero.service.ts, router/ts/app/heroes/heroes.module.ts, router/ts/app/heroes/heroes-routing.module.ts`, - 'null,null,v3,null,null,null,null,null', + '', `app.component.ts, app.module.ts, app-routing.module.ts, @@ -1331,7 +1388,7 @@ h3#merge-hero-routes Import hero module into AppModule The *Crisis Center* is a fake view at the moment. Time to make it useful. The new *Crisis Center* begins as a virtual copy of the *Heroes* module. - We create a new `app/crisis-center` folder, copy the Hero files, + Create a new `app/crisis-center` folder, copy the Hero files, and change every mention of "hero" to "crisis". A `Crisis` has an `id` and `name`, just like a `Hero` @@ -1341,43 +1398,34 @@ h3#merge-hero-routes Import hero module into AppModule Voilà, another feature module! - There's no point to this exercise unless we can learn something. - We do have new ideas and techniques in mind: + There's no point to this exercise unless you can learn something. + This section introduces new ideas and techniques into the _Crisis Center_ design: - * We'd like our route URLs to branch in to child route trees that reflect the component trees in our feature areas. + * The route URLs will branch into child route trees that parallel the component trees in the feature areas. - * The application should navigate to the *Crisis Center* by default. + * The router will prevent navigation away from the detail view while there are pending, unsaved changes. - * The router should prevent navigation away from the detail view while there are pending changes. + * The user will be able to cancel unwanted changes. - * The user should be able to cancel unwanted changes. + * The router will block access to certain features until the user logs-in. - * The router should block access to certain features until the user logs-in. - - * The application should display multiple routes indepdently of each other. - - * Changes to a feature module such as *Crisis Center* shouldn't provoke changes to the `AppModule` or + * In keeping with [*Separation of Concerns*](https://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html) + principle, changes to a feature module such as *Crisis Center* won't require changes to the `AppModule` or any other feature's component. - We need to [*separate our concerns*](https://blog.8thlight.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html). - We'll address all of these issues in the *Crisis Center* - starting with the introduction of **child routes** - -.l-sub-section - :marked - We'll leave *Heroes* in its less-than-perfect state to - serve as a contrast with what we believe to be a superior *Crisis Center* design. + Leave *Heroes* in its current state as a contrast with the *Crisis Center*. + You can decide later if the differences are worthwhile. :marked ### A Crisis Center with child routes - We'll organize the *Crisis Center* to conform to the following recommended pattern for Angular applications. + You'll organize the *Crisis Center* to conform to the following recommended pattern for Angular applications. * each feature area in its own folder within a defined module * each area with its own area root component * each area root component with its own router-outlet and child routes * area routes rarely (if ever) cross - If we had many feature areas, their component trees might look like this: + If you had many feature areas, their component trees might look like this: figure.image-display img(src='/resources/images/devguide/router/component-tree.png' alt="Component Tree" ) @@ -1402,14 +1450,14 @@ a#child-routing-component * It is dead simple — simpler even than the `AppComponent` template. It has no content, no links, just a `` for the *Crisis Center* child views. - Unlike `AppComponent` (and most other components), it **lacks a selector**. - It doesn't need one. We don't *embed* this component in a parent template. - We *navigate* to it from the outside, via the router. + Unlike `AppComponent` (and most other components), it _lacks a selector_. + It doesn't need one. You don't *embed* this component in a parent template. + You *navigate* to it from the outside, via the router. .l-sub-section :marked - We *can* give it a selector. There's no harm in it. - Our point is that we don't *need* one because we only *navigate* to it. + You *can* give it a selector. There's no harm in it. + The point is that you don't *need* one because you only *navigate* to it. :marked ### Child Route Configuration @@ -1422,14 +1470,14 @@ a#child-routing-component +makeExcerpt('app/crisis-center/crisis-center-home.component.ts (minus imports)', 'minus-imports') :marked - We create a `crisis-center-routing.module.ts` file as we did the `heroes-routing.module.ts` file. - But this time we define **child routes** *within* the parent `crisis-center` route. + Create a `crisis-center-routing.module.ts` file as you did the `heroes-routing.module.ts` file. + This time, you define **child routes** *within* the parent `crisis-center` route. +makeExcerpt('app/crisis-center/crisis-center-routing.module.1.ts (Routes)', 'routes') :marked Notice that the parent `crisis-center` route has a `children` property - with a single route containing our `CrisisListComponent`. The `CrisisListComponent` route + with a single route containing the `CrisisListComponent`. The `CrisisListComponent` route also has a `children` array with two routes. These two routes navigate to the two *Crisis Center* child components, @@ -1444,14 +1492,14 @@ a#child-routing-component display the `Crisis Center Home` and `Crisis Detail` route components. The `Crisis Detail` route is a child of the `Crisis List`. Since the router [reuses components](#reuse) - by default, the `Crisis Detail` component will be re-used as we select different crises. + by default, the `Crisis Detail` component will be re-used as you select different crises. - In contrast, back in the `Hero Detail` route, the component was recreated each time we selected a different hero. + In contrast, back in the `Hero Detail` route, the component was recreated each time you selected a different hero. At the top level, paths that begin with `/` refer to the root of the application. But these are child routes. They *extend* the path of the parent route. - With each step down the route tree, we add a slash followed by the route path (unless the route path is _empty_). + With each step down the route tree, you add a slash followed by the route path (unless the route path is _empty_). For example, the parent path to the `CrisisCenterComponent` is `/crisis-center` The router appends these child paths to the parent path to the `CrisisCenterComponent` (`/crisis-center`). @@ -1472,236 +1520,237 @@ code-example. h3#import-crisis-module Import crisis center module into the AppModule routes :marked - As with the `Heroes` module, we must import the `Crisis Center` module into the `AppModule`: + As with the `Heroes` module, you must import the `Crisis Center` module into the `AppModule`: +makeExcerpt('app/app.module.4.ts (import CrisisCenterModule)', 'crisis-center-module') :marked - We also remove the initial crisis center route from our `app-routing.module.ts`. Our routes - are now being provided by our `HeroesModule` and our `CrisisCenter` feature modules. We'll keep our `app-routing.module.ts` file - for general routes which we'll cover later in the chapter. + Remove the initial crisis center route from the `app-routing.module.ts`. + The feature routes are now provided by the `HeroesModule` and the `CrisisCenter` modules. + + The `app-routing.module.ts` file retains the top-level application routes such as the default and wildcard routes. +makeExcerpt('app/app-routing.module.3.ts (v3)', 'v3') -a#redirect -:marked - ### Redirecting routes - - When the application launches, the initial URL in the browser bar is something like: - -code-example. - localhost:3000 - -:marked - That doesn't match any of our configured routes which means that our application won't display any component when it's launched. - The user must click one of the navigation links to trigger a navigation and display something. - - We prefer that the application display the list of crises as it would if the user clicked the "Crisis Center" link or pasted `localhost:3000/crisis-center/` into the address bar. - This is our intended default route. - - The preferred solution is to add a `redirect` route that transparently translates from the initial relative URL (`''`) - to the desired default path (`/crisis-center`): - -+makeExcerpt('app/crisis-center/crisis-center-routing.module.2.ts' , 'redirect', '') - -:marked - A redirect route requires a `pathMatch` property to tell the router how to match a URL to the path of a route. - In this app, the router should select the route to the `CrisisListComponent` when the *entire URL* matches `''`, - so we set the `pathMatch` value to `'full'`. - -.l-sub-section - :marked - Technically, `pathMatch = 'full'` results in a route hit when the *remaining*, unmatched segments of the URL match `''`. - In our example, the redirect is at the top level of the route configuration tree so the *remaining* URL and the *entire* URL - are the same thing. - - The other possible `pathMatch` value is `'prefix'` which tells the router - to match the redirect route when the *remaining* URL ***begins*** with the redirect route's _prefix_ path. - - That's not what we want to do here. If the `pathMatch` value were `'prefix'`, - _every_ URL would match `''`. - We could never navigate to `/crisis-center/1` because the redirect route would match first and - send us to the `CrisisListComponent`. - - We should redirect to the `CrisisListComponent` _only_ when the _entire (remaining)_ url is `''`. - - Learn more in Victor Savkin's blog - [post on redirects](http://victorsavkin.com/post/146722301646/angular-router-empty-paths-componentless-routes). - - We'll discuss redirects in more detail in a future update to this chapter. - -:marked - The updated route definitions look like this: - -+makeExcerpt('app/crisis-center/crisis-center-routing.module.2.ts (routes v2)' , 'routes') - .l-main-section h2#relative-navigation Relative Navigation :marked - While building out our *Crisis Center* feature, we've navigated to the - *Crisis Detail* route using an **absolute path** that begins with a **slash**. - This navigation starts from the top of our route configuration to find the - matching path to our route. + While building out the *Crisis Center* feature, you navigated to the + *Crisis Detail* route using a so-called **absolute path** that begins with a _slash_. - We could continue to use absolute paths to navigate inside our *Crisis Center* - feature, but that makes our links very rigid. If we changed our parent `/crisis-center` - path, we would have to change our link parameters array. + The router matches such _absolute_ paths to routes starting from the top of the route configuration. - We can make our links more flexible by using **relative** navigation with the router. - * The full path to the route is not required. - * Navigation within our feature area remains intact if the parent route path is changed. - * The *link parameters array* only contains navigation relative to the current URL. + You could continue to use absolute paths like this to navigate inside the *Crisis Center* + feature, but that pins the links to the parent routing structure. + If you changed the parent `/crisis-center` path, you would have to change the link parameters array. + + You can free the links from this dependency by defining paths that are **relative** to the current URL segment. + Navigation _within_ the feature area remains intact even if you change the parent route path to the feature. + + Here's an example .l-sub-section :marked - The **link parameters array** supports a directory-like syntax for relative navigation. + The _link parameters array_ supports a directory-like syntax for relative navigation. `./` or `no leading slash` is relative to the current level. `../` to go up one level in the route path. - The relative navigation syntax can be used in combination with a *path*. If we wanted to navigate - from one route path to another sibling route path we could use `../path` convention to go up - one level and down to the sibling route path. + The can combine relative navigation syntax with an ancestor path. + If you must navigate to a sibling route, you could use the `../` convention to go up + one level, then over and down the sibling route path. :marked - In order to navigate relatively using the `Router` service, we use the `ActivatedRoute` - to give the router knowledge of where we are in the *RouterState*, which is our tree of - activated routes. We do this by adding an object as the second argument in our - `router.navigate` method after the *link parameters array* specifying the **relativeTo** property. - We set the `relativeTo` property to our `ActivatedRoute` and the router will merge our - navigation information into to the current URL. + To navigate a relative path with the `Router.navigate` method, you must supply the `ActivatedRoute` + to give the router knowledge of where you are in the current route tree. + + After the _link parameters array_, add an object with a `relativeTo` property set to the `ActivatedRoute`. + The router then calculates the target URL based on the active route's location. .l-sub-section :marked - When using router's `navigateByUrl` method, the navigation is **always** absolute. + **Always** specify the complete _absolute_ path when calling router's `navigateByUrl` method. :marked - ### Navigate to Crisis Detail relatively + ### Navigate to Crisis Detail with a relative URL - Let's update our *Crisis List* `onSelect` method to use relative navigation so we don't have - to start from the top of our route configuration. We've already injected the `ActivatedRoute` - into our constructor that we'll need for the relative navigation. + Update the *Crisis List* `onSelect` method to use relative navigation so you don't have + to start from the top of the route configuration. -+makeExcerpt('app/crisis-center/crisis-list.component.1.ts (constructor)', 'relative-navigation-ctor') + You've already injected the `ActivatedRoute` that you need to compose the relative navigation path. ++makeExcerpt('app/crisis-center/crisis-list.component.ts (constructor)', 'ctor') :marked - When we visit the *Crisis Center*, our path is `/crisis-center`, so we just want to add the `id` of the *Crisis Center* - to our existing path. When the router navigates, it will use the current path `/crisis-center`, - adding on our `id`. If our `id` were `1`, the resulting path would be `/crisis-center/1`. + When you visit the *Crisis Center*, the ancestor path is `/crisis-center`, + so you only need to add the `id` of the *Crisis Center* to the existing path. -+makeExcerpt('app/crisis-center/crisis-list.component.ts (relative navigation)', 'relative-navigation') ++makeExcerpt('app/crisis-center/crisis-list.component.ts (relative navigation)', 'onSelect') :marked - We'll also update the *Crisis Detail* component to navigate back to our *Crisis Center* list. We want to go back up a level - in the path, so we use to the `../` syntax. If our current `id` is `1`, the resulting path coming from `/crisis-center/1` - would be `/crisis-center`. - -+makeExcerpt('app/crisis-center/crisis-detail.component.1.ts (relative navigation)', 'relative-navigation') - -:marked - If we are using a `RouterLink` to navigate instead of the `Router` service, we can use the **same** - link parameters array, but we don't have to provide the object with the `relativeTo` property. The `ActivatedRoute` - is implicit in the `RouterLink` directive. + If you were using a `RouterLink` to navigate instead of the `Router` service, you'd use the _same_ + link parameters array, but you wouldn't provide the object with the `relativeTo` property. + The `ActivatedRoute` is implicit in a `RouterLink` directive. +makeExcerpt('app/crisis-center/crisis-list.component.1.ts (relative routerLink)', 'relative-navigation-router-link') - +:marked + Update the `gotoCrises` method of the `CrisisDetailComponent` to navigate back to the *Crisis Center* list using relative path navigation. + ++makeExcerpt('app/crisis-center/crisis-detail.component.ts (relative navigation)', 'gotoCrises-navigate') +:marked + Notice that the path goes up a level (`../`) syntax. + If the current crisis `id` is `1`, the resulting path back to the crisis list is `/crisis-center/;id=3;foo=foo`. + .l-main-section -h3#named-outlets Displaying Multiple Routes: Named Outlets and Secondary Routes +h3#named-outlets Displaying Multiple Routes in Named Outlets :marked - Up until now, we've used a single outlet and we've nested child routes under that outlet to group routes together. - The `Router` supports one primary `unnamed` outlet, but we can display multiple routes together, each displaying their own component - using one or more **named outlets**. + In this application, you decide to give users a way to contact the `Crisis Center`. + When a user clicks a "Contact" button, you want to display a message textbox in a popup view. + + The popup should stay open, even when switching between pages in the application, until the user closes it + by sending the message or canceling. + Clearly you can't put the popup in the same outlet as the other pages. - These named outlets are used to display **secondary routes**, which are configured the same way as a primary route, but - are independent of each other and can work in combination with each other routes. By using named outlets with secondary routes, - we can display multiple route components simultaneously. Secondary routes can also have their own child routes. This allows us to reflect the state of multiple - views in our application using the browser URL. + Until now, you've defined a single outlet and you've nested child routes under that outlet to group routes together. + In fact, the `Router` only supports one primary `unnamed` outlet per template. + + As it happens, a template can also have _any_ number of _named outlets_. + Each named outlet has its own set of routes with their own components. + Multiple outlets can be displaying different content, determined by different routes, all at the same time. - In our application, we want to give our users a way to contact the `Crisis Center` displayed through a modal. We also want this modal - to be displayed even when switching between pages in our application. We'll use a named outlet to display the modal and control its lifecycle - alongside our currently displayed route. + Add an outlet named "popup" in the `AppComponent`, directly below the regular _unnamed_ outlet. ++makeExcerpt('app/app.component.4.ts', 'outlets') +:marked + That's where a popup will go, once you learn how to route a popup component to it. - We'll create a new route component named `ComposeMessageComponent` in `app/compose-message.component.ts` to display our modal view the users will - use to contact the `Crisis Center`. We'll display a simple form to enter a message and a use an `Observable` to simulate a delay to handle the modal after - sending the message. +a#secondary-routes +:marked + #### Secondary routes + Named outlets are the targets of _secondary routes_. + + Secondary routes look like primary routes and you configure them the same way. + They differ in a few key respects. + * They are independent of each other + * They work in combination with other routes. + * They are displayed in named outlets. -+makeExcerpt('app/compose-message.component.1.ts (compose message component)', 'v1') + Create a new component named `ComposeMessageComponent` in `app/compose-message.component.ts`. + It displays a simple form with a header, an input box for the message, + and two buttons, "Send" and "Cancel". + +figure.image-display + img(src='/resources/images/devguide/router/contact-popup.png' alt="Contact popup" width="250") +:marked + Here's the component and its template: ++makeTabs( + `router/ts/app/compose-message.component.ts, router/ts/app/compose-message.component.html`, + null, + `app/compose-message.component.ts, app/compose-message.component.html`) +:marked + It looks about the same as any other component you've seen in this guide. + There are two noteworthy differences + + Note that the `send` method simulates latency by waiting a second before "sending" the message and closing the popup. + + The `closePopup` method closes the popup view by navigating to the "popup" outlet with a `null`. + That's a peculiarity covered [below](#clear-secondary-routes) + + As with other application components, you add the `ComposeMessageComponent` to the `declarations` of an `NgModule`. + Do so in the `AppModule`. + + #### Add a secondary route + + Open the `AppRoutingModule` and add a new `compose` route to the `appRoutes`. ++makeExcerpt('app/app-routing.module.3.ts (compose route)', 'compose') :marked - We'll add a `compose` route to our `AppRoutingModule`, using a route `path` and `component`. In order to use a named outlet, we add an additional property - to our route configuration called **outlet**. This outlet matches the name given to our `RouterOutlet` where we are going to to display the component. The `Router` - will place each route next to its intended `RouterOutlet` during the navigation process. - -+makeExcerpt('app/app-routing.module.3.ts (compose route)', '') + The `path` and `component` properties should be familiar. + There's a new property `outlet` set to `'popup'`. + This route now targets the "popup" outlet and the `ComposeMessageComponent` will display there. + The user needs a way to open the popup. + Open the `AppComponent` and add a "Contact" link. ++makeExcerpt('app/app.component.4.ts', 'contact-link') :marked - As with our other components, the `ComposeMessageComponent` is imported and added to our `AppModule`'s declarations. + Although the `compose` route is pinned to the "popup" outlet, that's not sufficient for wiring the route to a `RouterLink` directive. + You have to specify the named outlet in a _link parameters array_ and bind it to the `RouterLink` with a property binding. -+makeExcerpt('app/app.module.5.ts (compose component)', '') + The _link parameters array_ contains an object with a single `outlets` property whose value + is another object keyed by one (or more) outlet names. + In this case there is only the "popup" outlet property and its value is another _link parameters array_ that specifies the `compose` route. -:marked - As we did in our initial template, we'll add a `RouterOutlet` with an additional **name** attribute and provide our named **modal** outlet. This matches the - name of the `outlet` we used in our `AppRoutingModule`. - -+makeExcerpt('app/app.component.4.ts (named outlet)', '') - -:marked - Now we have two independent `RouterOutlet`s to display our routes. Routes without a specified `outlet` will use our primary `unnamed` outlet. Our `compose` outlet - will display our `ComposeMessageComponent`. Secondary routes are also reflected in our URL surrounded by parenthesis but are are seamlessly - handled by the `Router` across browsers the same way it handles [route parameters with matrix notation](#optional-route-parameters). We can visit any primary route in our application - and have our `compose` route displayed in combination with the primary route. An example URL displaying the `Crisis Center` list and `Compose` modal is displayed below. + You are in effect saying, _when the user clicks this link, display the component associated with the `compose` route in the `popup` outlet_. .l-sub-section :marked - http://localhost:3000/crisis-center(modal:compose) + This `outlets` object within an outer object was completely unnecessary + when there was only one route and one _unnamed_ outlet to think about. -:marked - If we break down the URL, we see the following parts. - * The primary route with the `crisis-center` path - * The parenthesis where our secondary route grouping starts and ends - * The name of the outlet (`modal`) split by a `colon` and followed with the secondary route path `compose` + The router assumed that your route specification targeted the _unnamed_ primary outlet + and created these objects for you. - Secondary routes are not limited to top level routes. Each level in our route configuration can contain a primary route in an unnamed outlet, - followed by any number of secondary routes displayed in named outlets. Secondary routes have all the same features of a primary route, including - access to their own [activated route](#activated-route). + Routing to a named outlet has revealed a previously hidden router truth: + you can target multiple outlets with multiple routes in the same `RouterLink` directive. + + You're not actually doing that here. + But to target a named outlet, you must use the richer, more verbose syntax. h3#secondary-route-navigation Secondary Route Navigation: merging routes during navigation :marked - We learned how the `Router` handles incoming URLs for secondary routes, but we can also navigate declaratively and imperatively using secondary routes - in the [link parameters array](#link-parameters-array). Let's update our application to display our `compose` route using `RouterLink` and navigating - away from a secondary route using the `Router` service. + Navigate to the _Crisis Center_ and click "Contact". + you should see something like the following URL in the browser address bar. - The `Link Parameters Array` supports secondary routes with an object as the last index in our array. This object uses an **outlets** that lets us build - our links including secondary outlets in the same way we build more dynamic router links. We'll add a `Contact` link to our `Crisis Center` menu to display our - secondary route. - -+makeExcerpt('app/app.component.ts (contact)', '') +code-example. + http:////crisis-center(popup:compose) :marked - The `outlets` property within our object contains the named outlets that will be updated during the navigation process. We'll add a key for the `modal` outlet - and the value for the outlet is the same link parameters array we use with primary routes. When using a `RouterLink` or navigating imperatively, the `Router` - will **merge** the current URL with our provided secondary route. As we navigate around our application, the `Contact` link will be updated with the current URL - and the secondary `(modal:compose)` route, so that we can open our `compose` route independently of our currently displayed route. Once we visit the secondary route, - it will be merged with the current URL across each navigation as long as they're under the same parent path. + The interesting part of the URL follows the ``: + * The `crisis-center` is the primary navigation. + * Parentheses surround the secondary route. + * The secondary route consist of an outlet name (`popup`), then a `colon` separator, followed with the secondary route path (`compose`) -.l-sub-section - :marked - When using router's `navigateByUrl` method, secondary routes will **not** be merged into the current URL and will need to be explicitly - provided. + Click the _Heroes_ link and look at the URL again. +code-example. + http:////heroes(popup:compose) +:marked + The primary navigation part has changed; the secondary route is the same. + + The router is keeping track of two separate branches in a navigation tree and generating a representation of that tree in the URL. + + You can add many more outlets and routes, at the top level and in nested levels, creating a navigation tree with many branches. + The router will generate the URL to go with it. + + You can tell the router to navigate an entire tree at once by filling out the `outlets` object mentioned above. + Then pass that object inside a _link parameters array_ to the `router.navigate` method. + + Experiment with these possibilities at your leisure. + + +a#clear-secondary-routes :marked #### Clearing Secondary Routes - Secondary outlets persist across navigation under the same parent route. We can also remove secondary outlets using a `RouterLink` or imperatively - with the `Router` service using the [link parameters array](#link-parameters-array). We'll update our `ComposeMessageComponent` to remove the - secondary `compose` route when our user cancels the message or its sent successfully. + As you've learned, a component in an outlet persists until you navigate away to a new component. + Secondary outlets are no different in this regard. - We'll add a `closeModal` method to our `ComposeMessageComponent` that navigates imperatively using the `router.navigate` method. Since we only want to modify the - secondary route, we only need to provide the secondary route object and `null` out the `modal` outlet. This will remove the secondary route from named `modal` `RouterOutlet` - and update the current URL. + Each secondary outlet has its own navigation, independent of the navigation driving the primary outlet. + Changing a current route that displays in the primary outlet has no effect on the "popup" outlet. + That's why the "popup" stays visible as you navigate among the crises and heroes. -+makeExcerpt('app/compose-message.component.ts (remove secondary route)', '') + Clicking the "send" or "cancel" buttons _does_ clear the popup view. + To see how, look at the `ComposeMessageComponent.closePopup` method again: ++makeExcerpt('app/compose-message.component.ts (closePopup)', 'closePopup') + :marked + It navigates imperatively with the `Router.navigate` method, passing in a [link parameters array](#link-parameters-array). + + Like the array bound to the _Contact_ `RouterLink` in the `AppComponent`, + this one includes an object with an `outlets` property. + The `outlets` property value is another object with outlet names for keys. + The only named outlet is `'popup'`. + + This time, the value of `'popup'` is `null`. That's not a route, but it is a legitimate value. + Setting _popup_ `RouterOutlet` to `null` clears the outlet and removes the secondary "popup" route from the current URL. .l-main-section @@ -1714,11 +1763,11 @@ h2#guards Route Guards That's not always the right thing to do. * Perhaps the user is not authorized to navigate to the target component. * Maybe the user must login (*authenticate*) first. - * Maybe we should fetch some data before we display the target component. - * We might want to save pending changes before leaving a component. - * We might ask the user if it's OK to discard pending changes rather than save them. + * Maybe you should fetch some data before you display the target component. + * You might want to save pending changes before leaving a component. + * You might ask the user if it's OK to discard pending changes rather than save them. - We can add ***guards*** to our route configuration to handle these scenarios. + You can add _guards_ to the route configuration to handle these scenarios. A guard's return value controls the router's behavior: * if it returns `true`, the navigation process continues @@ -1748,33 +1797,34 @@ h2#guards Route Guards 5. [CanLoad](../api/router/index/CanLoad-interface.html) to mediate navigation *to* a feature module loaded _asynchronously_. :marked - We can have multiple guards at every level of a routing hierarchy. + You can have multiple guards at every level of a routing hierarchy. The router checks the `CanDeactivate` and `CanActivateChild` guards first, from deepest child route to the top. Then it checks the `CanActivate` guards from the top down to the deepest child route. If the feature module is loaded asynchronously, the `CanLoad` guard is checked before the module is loaded. If _any_ guard returns false, pending guards that have not completed will be canceled, and the entire navigation is canceled. - Let's look at some examples. + You'll see several examples over the next few sections. a#can-activate-guard :marked ### *CanActivate*: requiring authentication Applications often restrict access to a feature area based on who the user is. - We could permit access only to authenticated users or to users with a specific role. - We might block or limit access until the user's account is activated. + You could permit access only to authenticated users or to users with a specific role. + You might block or limit access until the user's account is activated. The `CanActivate` guard is the tool to manage these navigation business rules. #### Add an admin feature module - We intend to extend the Crisis Center with some new *administrative* features. - Those features aren't defined yet. So we add a new feature module named `AdminModule`. - We'll follow our same convention by creating an `admin` folder with a feature - module file, route file and supporting components. + In this next section, you'll extend the Crisis Center with some new *administrative* features. + Those features aren't defined yet. + But you can start by adding a new feature module named `AdminModule`. - Our admin feature module file structure looks like this: + Create an `admin` folder with a feature module file, a routing configuration file, and supporting components. + + The admin feature file structure looks like this: .filetree .file app/admin @@ -1787,7 +1837,7 @@ a#can-activate-guard .file manage-heroes.component.ts :marked - Our admin feature module contains our `AdminComponent` used for routing within our + The admin feature module contains the `AdminComponent` used for routing within the feature module, a dashboard route and two unfinished components to manage crises and heroes. +makeTabs( @@ -1807,65 +1857,68 @@ a#can-activate-guard .l-sub-section :marked - Since our admin dashboard `RouterLink` is an empty path route in our `AdminModule`, it - is considered a match to any route within our admin feature area. We only want the `Dashboard` - link to be active when we visit that route. We've added an additional binding to our `Dashboard` routerLink, - `[routerLinkActiveOptions]="{ exact: true }"` which will only mark the `./` link as active when - we navigate the to `/admin` URL and not when we navigate to one the other child routes. + Since the admin dashboard `RouterLink` is an empty path route in the `AdminModule`, it + is considered a match to any route within the admin feature area. + You only want the `Dashboard` link to be active when the user visits that route. + Add an additional binding to the `Dashboard` routerLink, + `[routerLinkActiveOptions]="{ exact: true }"` which marks the `./` link as active when + the user navigates to the `/admin` URL and not when navigating to any of the child routes. :marked - Our initial admin routing configuration: + The initial admin routing configuration: +makeExcerpt('app/admin/admin-routing.module.1.ts (admin routing)', 'admin-routes') h3#component-less-route Component-Less Route: grouping routes without a component :marked - Looking at our child route under the `AdminComponent`, we have a route with a **path** and a **children** - property but it's not using a **component**. We haven't made a mistake in our configuration, because we can - use a **component-less** route. + Looking at the child route under the `AdminComponent`,there is a `path` and a `children` + property but it's not using a `component`. + You haven't made a mistake in the configuration. + You've defined a _component-less_ route. - We want to group our `Crisis Center` management routes under the `admin` path, but we don't need a component - just to group those routes under an additional `RouterOutlet`. This also allows us to [guard child routes](#can-activate-child-guard). + The goal is to group the `Crisis Center` management routes under the `admin` path. + You don't need a component to do it. + A _component-less_ route makes it easier to [guard child routes](#can-activate-child-guard). :marked - Next, we'll import the `AdminModule` into our `app.module.ts` and add it to the `imports` array - to register our admin routes. + Next, import the `AdminModule` into the `app.module.ts` and add it to the `imports` array + to register the admin routes. +makeExcerpt('app/app.module.4.ts (admin module)', 'admin-module') :marked - And we add a link to the `AppComponent` shell that users can click to get to this feature. + Add an "Admin" link to the `AppComponent` shell so that users can get to this feature. -+makeExcerpt('app/app.component.4.ts', 'template') ++makeExcerpt('app/app.component.5.ts', 'template') :marked #### Guard the admin feature - Currently every route within our *Crisis Center* is open to everyone. + Currently every route within the *Crisis Center* is open to everyone. The new *admin* feature should be accessible only to authenticated users. - We could hide the link until the user logs in. But that's tricky and difficult to maintain. + You could hide the link until the user logs in. But that's tricky and difficult to maintain. - Instead we'll write a `CanActivate` guard to redirect anonymous users to the login page when they try to reach the admin component. + Instead you'll write a `CanActivate` guard to redirect anonymous users to the login page when they try to enter the admin area. - This is a general purpose guard — we can imagine other features that require authenticated users — - so we create an `auth-guard.service.ts` in the application root folder. + This is a general purpose guard — you can imagine other features that require authenticated users — + so you create an `auth-guard.service.ts` in the application root folder. - At the moment we're interested in seeing how guards work so our first version does nothing useful. + At the moment you're interested in seeing how guards work so the first version does nothing useful. It simply logs to console and `returns` true immediately, allowing navigation to proceed: +makeExcerpt('app/auth-guard.service.1.ts') :marked - Next we open `admin-routing.module.ts `, import the `AuthGuard` class, and + Next you open `admin-routing.module.ts `, import the `AuthGuard` class, and update the admin route with a `CanActivate` guard property that references it: +makeExcerpt('app/admin/admin-routing.module.2.ts (guarded admin route)', 'admin-route') :marked - Our admin feature is now protected by the guard, albeit protected poorly. + The admin feature is now protected by the guard, albeit protected poorly. #### Teach *AuthGuard* to authenticate - Let's make our `AuthGuard` at least pretend to authenticate. + Make the `AuthGuard` at least pretend to authenticate. The `AuthGuard` should call an application service that can login a user and retain information about the current user. Here's a demo `AuthService`: @@ -1873,37 +1926,37 @@ h3#component-less-route Component-Less Route: grouping routes without a c +makeExcerpt('app/auth.service.ts') :marked - Although it doesn't actually log in, it has what we need for this discussion. - It has an `isLoggedIn` flag to tell us whether the user is authenticated. + Although it doesn't actually log in, it has what you need for this discussion. + It has an `isLoggedIn` flag to tell you whether the user is authenticated. Its `login` method simulates an API call to an external service by returning an observable that resolves successfully after a short pause. - The `redirectUrl` property will store our attempted URL so we can navigate to it after authenticating. + The `redirectUrl` property will store the attempted URL so you can navigate to it after authenticating. - Let's revise our `AuthGuard` to call it. + Revise the `AuthGuard` to call it. +makeExcerpt('app/auth-guard.service.2.ts (v2)', '') :marked - Notice that we *inject* the `AuthService` and the `Router` in the constructor. - We haven't provided the `AuthService` yet but it's good to know that we can inject helpful services into our routing guards. + Notice that you *inject* the `AuthService` and the `Router` in the constructor. + You haven't provided the `AuthService` yet but it's good to know that you can inject helpful services into routing guards. This guard returns a synchronous boolean result. If the user is logged in, it returns true and the navigation continues. The `ActivatedRouteSnapshot` contains the _future_ route that will be activated and the `RouterStateSnapshot` - contains the _future_ `RouterState` of our application, should we pass through our guard check. + contains the _future_ `RouterState` of the application, should you pass through the guard check. - If the user is not logged in, we store the attempted URL the user came from using the `RouterStateSnapshot.url` and - tell the router to navigate to a login page — a page we haven't created yet. - This secondary navigation automatically cancels the current navigation; we return `false` just to be clear about that. + If the user is not logged in, you store the attempted URL the user came from using the `RouterStateSnapshot.url` and + tell the router to navigate to a login page — a page you haven't created yet. + This secondary navigation automatically cancels the current navigation; you return `false` just to be clear about that. #### Add the *LoginComponent* - We need a `LoginComponent` for the user to log in to the app. After logging in, we'll redirect - to our stored URL if available, or use the default URL. - There is nothing new about this component or the way we wire it into the router configuration. + You need a `LoginComponent` for the user to log in to the app. After logging in, you'll redirect + to the stored URL if available, or use the default URL. + There is nothing new about this component or the way you wire it into the router configuration. - We'll register a `/login` route in our `login-routing.module.ts` and add the necessary providers to the `providers` - array. In our `app.module.ts`, we'll import the `LoginComponent` and add it to our `AppModule` `declarations`. - We'll also import and add the `LoginRoutingModule` to our `AppModule` imports. + Register a `/login` route in the `login-routing.module.ts` and add the necessary providers to the `providers` + array. In the `app.module.ts`, import the `LoginComponent` and add it to the `AppModule` `declarations`. + Import and add the `LoginRoutingModule` to the `AppModule` imports as well. +makeTabs( `router/ts/app/app.module.ts, @@ -1918,29 +1971,31 @@ h3#component-less-route Component-Less Route: grouping routes without a c .l-sub-section :marked - Guards and the service providers they require **must** be provided at the module-level. This allows + Guards and the service providers they require _must_ be provided at the module-level. This allows the Router access to retrieve these services from the `Injector` during the navigation process. The same rule applies for feature modules loaded [asynchronously](#asynchronous-routing). h3#can-activate-child-guard CanActivateChild: guarding child routes :marked - As we learned about guarding routes with `CanActivate`, we can also protect child routes with the `CanActivateChild` - guard. The `CanActivateChild` guard works similarly to the `CanActivate` guard, but the difference is its run _before_ - each child route is activated. We protected our admin feature module from unauthorized access, but we could also - protect child routes within our feature module. + You can also protect child routes with the `CanActivateChild` guard. + The `CanActivateChild` guard is similar to the `CanActivate` guard. + The key difference is that it runs _before_ any child route is activated. - Let's extend our `AuthGuard` to protect when navigating between our `admin` routes. First we'll open our - `auth-guard.service.ts` and add `CanActivateChild` interface to our imported tokens from the router package. + You protected the admin feature module from unauthorized access. + You should also protect child routes _within_ the feature module. - Next, we'll implement the `canActivateChild` method which takes the same arguments as the `canActivate` method, - an `ActivatedRouteSnapshot` and `RouterStateSnapshot`. The `canActivateChild` behaves the same way the other - guards do, returning an `Observable` or `Promise` for async checks and `boolean` for sync checks. - We'll return a `boolean` + Extend the `AuthGuard` to protect when navigating between the `admin` routes. + Open the `auth-guard.service.ts` and add the `CanActivateChild` interface to the imported tokens from the router package. + + Next, implement the `canActivateChild` method which takes the same arguments as the `canActivate` method: + an `ActivatedRouteSnapshot` and `RouterStateSnapshot`. + The `canActivateChild` can return an `Observable` or `Promise` for async checks and a `boolean` for sync checks. + This one returns a `boolean` +makeExcerpt('app/auth-guard.service.3.ts (excerpt)', 'can-activate-child') :marked - We add the same `AuthGuard` to our `component-less` admin route to protect all other child routes at one time + Add the same `AuthGuard` to the `component-less` admin route to protect all other child routes at one time instead of adding the `AuthGuard` to each route individually. +makeExcerpt('app/admin/admin-routing.module.3.ts (excerpt)', 'can-activate-child') @@ -1949,41 +2004,42 @@ h3#can-deactivate-guard CanDeactivate: handling unsaved changes :marked Back in the "Heroes" workflow, the app accepts every change to a hero immediately without hesitation or validation. - In the real world, we might have to accumulate the users changes. - We might have to validate across fields. We might have to validate on the server. - We might have to hold changes in a pending state until the user confirms them *as a group* or + In the real world, you might have to accumulate the users changes. + You might have to validate across fields. + You might have to validate on the server. + You might have to hold changes in a pending state until the user confirms them *as a group* or cancels and reverts all changes. - What do we do about unapproved, unsaved changes when the user navigates away? - We can't just leave and risk losing the user's changes; that would be a terrible experience. + What do you do about unapproved, unsaved changes when the user navigates away? + You can't just leave and risk losing the user's changes; that would be a terrible experience. - We'd like to pause and let the user decide what to do. - If the user cancels, we'll stay put and allow more changes. + You'd prefer to pause and let the user decide what to do. + If the user cancels, you'll stay put and allow more changes. If the user approves, the app can save. - We still might delay navigation until the save succeeds. - If we let the user move to the next screen immediately and - the save failed (perhaps the data are ruled invalid), we would have lost the context of the error. + You still might delay navigation until the save succeeds. + If you let the user move to the next screen immediately and + the save failed (perhaps the data are ruled invalid), you would have lost the context of the error. - We can't block while waiting for the server — that's not possible in a browser. - We need to stop the navigation while we wait, asynchronously, for the server + You can't block while waiting for the server — that's not possible in a browser. + You need to stop the navigation while you wait, asynchronously, for the server to return with its answer. - We need the `CanDeactivate` guard. + You need the `CanDeactivate` guard. ### Cancel and Save - Our sample application doesn't talk to a server. - Fortunately, we have another way to demonstrate an asynchronous router hook. + The sample application doesn't talk to a server. + Fortunately, you have another way to demonstrate an asynchronous router hook. Users update crisis information in the `CrisisDetailComponent`. - Unlike the `HeroDetailComponent`, the user changes do not update the - crisis entity immediately. We update the entity when the user presses the *Save* button. - We discard the changes if the user presses the *Cancel* button. + Unlike the `HeroDetailComponent`, the user changes do not update the crisis entity immediately. + Update the entity when the user presses the *Save* button. + Discard the changes when the user presses the *Cancel* button. Both buttons navigate back to the crisis list after save or cancel. -+makeExcerpt('app/crisis-center/crisis-detail.component.1.ts (excerpt)', 'cancel-save') ++makeExcerpt('app/crisis-center/crisis-detail.component.ts (cancel and save methods)', 'cancel-save') :marked What if the user tries to navigate away without saving or canceling? @@ -1991,13 +2047,13 @@ h3#can-deactivate-guard CanDeactivate: handling unsaved changes Both actions trigger a navigation. Should the app save or cancel automatically? - We'll do neither. Instead we'll ask the user to make that choice explicitly + You'll do neither. Instead you'll ask the user to make that choice explicitly in a confirmation dialog box that *waits asynchronously for the user's answer*. .l-sub-section :marked - We could wait for the user's answer with synchronous, blocking code. - Our app will be more responsive ... and can do other work ... + You could wait for the user's answer with synchronous, blocking code. + The app will be more responsive ... and can do other work ... by waiting for the user's answer asynchronously. Waiting for the user asynchronously is like waiting for the server asynchronously. :marked @@ -2009,24 +2065,27 @@ h3#can-deactivate-guard CanDeactivate: handling unsaved changes a#CanDeactivate :marked - We create a `Guard` that will check for the presence of a `canDeactivate` function in our component, in this - case being `CrisisDetailComponent`. We don't need to know the details of how our `CrisisDetailComponent` confirms deactivation. - This makes our guard reusable, which is an easy win for us. + Create a _guard_ that checks for the presence of a `canDeactivate` method in a component - any component. + The `CrisisDetailComponent` will have this method. + But the guard doesn't have to know that. + The guard shouldn't know the details of any component's deactivation method. + It need only detect that the component has a `canDeactivate` method and call it. + This approach makes the guard reusable. +makeExample('app/can-deactivate-guard.service.ts') :marked - Alternatively, We could make a component-specific `CanDeactivate` guard for our `CrisisDetailComponent`. The `canDeactivate` method provides us - with the current instance of our `component`, the current `ActivatedRoute` and `RouterStateSnapshot` in case we needed to access - some external information. This would be useful if we only wanted to use this guard for this component and needed to ask the component's + Alternatively, You could make a component-specific `CanDeactivate` guard for the `CrisisDetailComponent`. The `canDeactivate` method provides you + with the current instance of the `component`, the current `ActivatedRoute` and `RouterStateSnapshot` in case you needed to access + some external information. This would be useful if you only wanted to use this guard for this component and needed to ask the component's properties in or to confirm whether the router should allow navigation away from it. +makeExcerpt('app/can-deactivate-guard.service.1.ts (component-specific)', '') :marked - Looking back at our `CrisisDetailComponent`, we have implemented our confirmation workflow for unsaved changes. + Looking back at the `CrisisDetailComponent`, you have implemented the confirmation workflow for unsaved changes. -+makeExcerpt('app/crisis-center/crisis-detail.component.1.ts (excerpt)', 'cancel-save-only') ++makeExcerpt('app/crisis-center/crisis-detail.component.ts (excerpt)', 'canDeactivate') :marked Notice that the `canDeactivate` method *can* return synchronously; @@ -2035,87 +2094,88 @@ a#CanDeactivate to resolve to truthy (navigate) or falsey (stay put). :marked - We add the `Guard` to our crisis detail route in `crisis-center-routing.module.ts` using the `canDeactivate` array. + Add the `Guard` to the crisis detail route in `crisis-center-routing.module.ts` using the `canDeactivate` array. +makeExcerpt('app/crisis-center/crisis-center-routing.module.3.ts (can deactivate guard)', '') :marked - We also need to add the `Guard` to our main `AppRoutingModule` `providers` so the `Router` can inject it during the navigation process. + Add the `Guard` to the main `AppRoutingModule` `providers` so the `Router` can inject it during the navigation process. +makeExample('app/app-routing.module.4.ts', '', '') :marked - Now we have given our user a safeguard against unsaved changes. + Now you have given the user a safeguard against unsaved changes. h3#resolve-guard Resolve: pre-fetching component data :marked - In our `Hero Detail` and `Crisis Detail`, we waited until the route was activated to fetch our respective hero or crisis. + In the `Hero Detail` and `Crisis Detail`, you waited until the route was activated to fetch the respective hero or crisis. - This worked well for us, but we can always do better. - If we were using a real world api, there may be some delay in when the data we want to display gets returned. - We don't want to display a blank component until the data loads in this situation. + This worked well, but you can do better. + If you were using a real world api, there might be some delay before the data to display is returned from the server. + You don't want to display a blank component while waiting for the data. - We'd like to pre-fetch data from the server so it's ready the moment our route is activated. - We'd also like to handle the situation where our data fails to load or some other error condition occurs. - This would help us in our `Crisis Center` if we navigated to an `id` that doesn't return a record. - We could send the user back to the `Crisis List` where we only show valid crisis centers. - We want to delay rendering of our route component until all necessary data has been fetched or some action - has occurred. + You prefer to pre-fetch data from the server so it's ready the moment the route is activated. + You'd like to handle errors before routing to the componet. + There's no point in navigating to a crisis detail for an `id` that doesn't have a record. + You'd rather send the user back to the `Crisis List` where you only show valid crisis centers. - We need the `Resolve` guard. + In summary, you want to delay rendering the routed component until all necessary data have been fetched. + + You need a *resolver*. ### Fetch data before navigating - We'll update our `Crisis Detail` route to resolve our Crisis before loading the route, or if the user happens to - navigate to an invalid crisis center `:id`, we'll navigate back to our list of existing crises. + At the moment, the `CrisisDetailComponent` retrieves the selected crisis. + If the crisis is not found, it navigates back to the crisis list view. - The **`Resolve`** interface can be implemented as a service to resolve route data either synchronously or asynchronously. - In `CrisisDetailComponent`, we used the `ngOnInit` to retrieve the `Crisis` information. - We also navigated the user away from the route if the `Crisis` was not found. It would be more efficient to perform this - action before the route is ever activated. + The experience might be better all of this were handled first, before the route is activated. + A `CrisisDetailResolver` service could retrieve a `Crisis` or navigate away if the `Crisis` does not existing + _before_ activating the route and creating the `CrisisDetailComponent`. - We'll create a `CrisisDetailResolve` service that will handle retrieving the `Crisis` and navigating the user away if the `Crisis` does - not exist. Then we can be assured that when we activate the `CrisisDetailComponent`, the associated Crisis will already be available - for display. + Create the `crisis-detail-resolver.service.ts` file within the `Crisis Center` feature area. - Let's create our `crisis-detail-resolve.service.ts` file within our `Crisis Center` feature area. - -+makeExample('app/crisis-center/crisis-detail-resolve.service.ts', '') ++makeExample('app/crisis-center/crisis-detail-resolver.service.ts', '') :marked - We'll take the relevant parts of the `ngOnInit` lifecycle hook in our `CrisisDetailComponent` and move them into our `CrisisDetailResolve` guard. - We import the `Crisis` model and `CrisisService` and also the `Router` for navigation from our resolve implementation. We want to be explicit about - the data we are resolving, so we implement the `Resolve` interface with a type of `Crisis`. This lets us know that what we will resolve will match our - `Crisis` model. We inject the `CrisisService` and `Router` and implement the `resolve` method that supports a `Promise`, `Observable` or a synchronous - return value. + Take the relevant parts of the crisis retrieval logic in `CrisisDetailComponent.ngOnInit` move them into the `CrisisDetailResolver`. + Import the `Crisis` model and `CrisisService` and also the `Router` so you can navigate elsewhere if you can't fetch the crisis. + + Be explicit. Implement the `Resolve` interface with a type of `Crisis`. + + Inject the `CrisisService` and `Router` and implement the `resolve` method. + That method could return a `Promise`, an `Observable`, or a synchronous return value. - We'll use our `CrisisService.getCrisis` method that returns a promise to prevent our route from loading until the data is fetched. If we don't find a valid `Crisis`, - we navigate the user back to the `CrisisList`, canceling the previous in-flight navigation to the crisis details. + The `CrisisService.getCrisis` method returns a promise. + Return that promise to prevent the route from loading until the data is fetched. + If it doesn't return a valid `Crisis`, navigate the user back to the `CrisisListComponent`, + canceling the previous in-flight navigation to the `CrisisDetailComponent`. - Now that our guard is ready, we'll import it in our `crisis-center-routing.module.ts` and use the `resolve` object in our route configuration. + Import this resolver in the `crisis-center-routing.module.ts` and add a `resolve` object to the `CrisisDetailComponent` route configuration. - We'll add the `CrisisDetailResolve` service to our `CrisisCenterRoutingModule`'s `providers`, so its available to the `Router` during the navigation process. + Remember to add the `CrisisDetailResolver` service to the `CrisisCenterRoutingModule`'s `providers`. -+makeExcerpt('app/crisis-center/crisis-center-routing.module.4.ts (resolve)', 'crisis-detail-resolve') ++makeExcerpt('app/crisis-center/crisis-center-routing.module.4.ts (resolver)', 'crisis-detail-resolver') :marked - Now that we've added our `Resolve` resolver to fetch data before the route loads, we no longer need to do this once we get into our `CrisisDetailComponent`. - We'll update the `CrisisDetailComponent` to use the `ActivatedRoute` data, which is where our `crisis` property from our `Resolve` guard will be provided. - Once activated, all we need to do is set our local `crisis` and `editName` properties from our resolved `Crisis` information. The `Crisis` is being provided - at the time the route component is activated. + The `CrisisDetailComponent` should no longer fetch the crisis. + Update the `CrisisDetailComponent` to get the crisis from the `ActivatedRoute.data.crisis` property instead; + that's where you said it should be when you re-configured the route. + It will be there when the `CrisisDetailComponent` ask for it. -+makeExcerpt('app/crisis-center/crisis-detail.component.ts (ngOnInit v2)', 'crisis-detail-resolve') ++makeExcerpt('app/crisis-center/crisis-detail.component.ts (ngOnInit v2)', 'ngOnInit') :marked **Two critical points** - 1. The router interface is optional. We don't inherit from a base class. We simply implement the interface method or not. + 1. The router's `Resolve` interface is optional. + The `CrisisDetailResolver` doesn't inherit from a base class. + The router looks for that method and calls it if found. - 1. We rely on the router to call the resolver. We don't worry about all the ways that the user - could navigate away. That's the router's job. - We simply write this class and let the router take it from there. + 1. Rely on the router to call the resolver. + Don't worry about all the ways that the user could navigate away. + That's the router's job. Write this class and let the router take it from there. - The relevant *Crisis Center* code for this milestone is + The relevant *Crisis Center* code for this milestone follows. +makeTabs( `router/ts/app/app.component.ts, @@ -2124,7 +2184,7 @@ h3#resolve-guard Resolve: pre-fetching component data router/ts/app/crisis-center/crisis-center-routing.module.4.ts, router/ts/app/crisis-center/crisis-list.component.ts, router/ts/app/crisis-center/crisis-detail.component.ts, - router/ts/app/crisis-center/crisis-detail-resolve.service.ts, + router/ts/app/crisis-center/crisis-detail-resolver.service.ts, router/ts/app/crisis-center/crisis.service.ts `, null, @@ -2134,7 +2194,7 @@ h3#resolve-guard Resolve: pre-fetching component data crisis-center-routing.module.ts, crisis-list.component.ts, crisis-detail.component.ts, - crisis-detail-resolve.service.ts, + crisis-detail-resolver.service.ts, crisis.service.ts `) @@ -2152,183 +2212,196 @@ a#fragment :marked ### Query Parameters and Fragments - In our [route parameters](#optional-route-parameters) example, we only dealt with parameters specific to - our route, but what if we wanted optional parameters available to all routes? This is where our - query parameters come into play and serve a special purpose in our application. + In the [route parameters](#optional-route-parameters) example, you only dealt with parameters specific to + the route, but what if you wanted optional parameters available to all routes? + This is where query parameters come into play. [Fragments](https://en.wikipedia.org/wiki/Fragment_identifier) refer to certain elements on the page identified with an `id` attribute. - We'll update our `AuthGuard` to provide a `session_id` query that will remain after navigating to another route. + Update the `AuthGuard` to provide a `session_id` query that will remain after navigating to another route. - We'll also provide an arbitrary `anchor` fragment, which we would use to jump to a certain point on our page. + Add an `anchor` element so you can jump to a certain point on the page. - We'll add the `NavigationExtras` object to our `router.navigate` method that navigates us to our `/login` route. + Add the `NavigationExtras` object to the `router.navigate` method that navigates you to the `/login` route. +makeExcerpt('app/auth-guard.service.4.ts (v3)', '') :marked - We can also **preserve** query parameters and fragments across navigations without having to re-provide them - when navigating. In our `LoginComponent`, we'll add an *object* as the second argument in our `router.navigate` function + You can also preserve query parameters and fragments across navigations without having to re-provide them + when navigating. In the `LoginComponent`, you'll add an *object* as the second argument in the `router.navigate` function and provide the `preserveQueryParams` and `preserveFragment` to pass along the current query parameters and fragment to the next route. +makeExcerpt('app/login.component.ts', 'preserve') :marked - Since we'll be navigating to our *Admin Dashboard* route after logging in, we'll update it to handle our + Since you'll be navigating to the *Admin Dashboard* route after logging in, you'll update it to handle the query parameters and fragment. +makeExcerpt('app/admin/admin-dashboard.component.2.ts (v2)', '') :marked - *Query Parameters* and *Fragments* are also available through the `ActivatedRoute` service available to route components. - Just like our *route parameters*, query parameters and fragments are provided as an `Observable`. - For our updated *Crisis Admin* component we'll feed the `Observable` directly into our template using the `AsyncPipe`, which - will handle _unsubscribing_ from the `Observable` for us when the component is destroyed. + *Query Parameters* and *Fragments* are also available through the `ActivatedRoute` service. + Just like *route parameters*, the query parameters and fragments are provided as an `Observable`. + The updated *Crisis Admin* component feeds the `Observable` directly into the template using the `AsyncPipe`. include ../../../_includes/_see-addr-bar :marked - Following the steps in this process, we can click on the *Admin* button, that takes us to the *Login* - page with our provided `query params` and `fragment`. After we click the login button, we notice that - we have been redirected to the `Admin Dashboard` page with our `query params` and `fragment` still intact. We can use - these persistent bits of information for things that need to be provided with across pages interaction like + Following the steps in this process, you can click on the *Admin* button, that takes you to the *Login* + page with the provided `query params` and `fragment`. After you click the login button, notice that + you have been redirected to the `Admin Dashboard` page with the `query params` and `fragment` still intact. + + You can use these persistent bits of information for things that need to be provided with across pages interaction like authentication tokens or session ids. .l-sub-section :marked The `query params` and `fragment` can also be preserved using a `RouterLink` with - the **preserveQueryParams** and **preserveFragment** bindings respectively. + the `preserveQueryParams` and `preserveFragment` bindings respectively. .l-main-section :marked ## Milestone #6: Asynchronous Routing - As we have completed our milestones, our application has naturally gotten larger. As we continue to build - out feature areas our overall application size will get larger also. At some point we'll reach a tipping - point in where our application takes a significant enough time to load. This is not a viable long term solution. + As you have completed the milestones, the application has naturally gotten larger. + As you continue to build out feature areas, the overall application size will get larger also. + At some point you'll reach a tipping point where the application takes long time to load. - So how do we combat this problem? We introduce asynchronous routing into our application and take advantage of loading - feature areas _lazily_. This buys us multiple things: + How do you combat this problem? With asynchronous routing which loads feature modules _lazily_, on request. + Lazy loading has multiple benefits. - * We can continue building out feature areas without increasing our initial bundle. - * We can load feature areas only when requested by the user. - * We can speed up load time for users that only visit certain areas of our application. + * You can load feature areas only when requested by the user. + * You can speed up load time for users that only visit certain areas of the application. + * You can continue expanding lazy-loaded feature areas without increasing the size of the initial load bundle. - These are all things we want to have in our application, so let's apply this to our current setup. We've already made - great strides by organizing our application into four modules: `AppModule`, `HeroesModule`, `AdminModule` and `CrisisCenterModule`. - Our `AdminModule` is the area of our application that would be scoped to a small set of users, so we'll take advantage - of asynchronous routing and only load the `Admin` feature area when requested. + You're already made part way there. + By organizing the application into modules — + `AppModule`, `HeroesModule`, `AdminModule` and `CrisisCenterModule` — you have natural candidates for lazy-loading. + + Some modules, like `AppModule`, must be loaded from the start. + But other can and should be lazy-loaded. + The `AdminModule`, for example, is needed by a few, authorized users, + You should only load it when requested by the right people. :marked ### Lazy-Loading route configuration - We'll start by adding an `admin` route to our `app-routing.module.ts` file. We want to load our `Admin` module asynchronously, - so we'll use the `loadChildren` property in our route config where previously we used the `children` property to include our child routes. + Change the `admin` **path** in the `admin-routing.module.ts` from `'admin'` to an empty string, `''`, the _empty path_. - We'll also change our `admin` **path** in our `admin-routing.module.ts` to an empty path. The `Router` supports - *empty path* routes, which we can use for grouping routes together without adding any additional paths to the URL. Our - users will still visit `/admin` and our `AdminComponent` still serves as our *Routing Component* which contains - our child routes. + The `Router` supports *empty path* routes; + use them to group routes together without adding any additional path segments to the URL. + Users will still visit `/admin` and the `AdminComponent` still serves as the *Routing Component* containing child routes. -+makeTabs( - `router/ts/app/app-routing.module.5.ts, - router/ts/app/admin/admin-routing.module.ts`, - 'lazy-load-admin,', - `app-routing.module.ts (load children), - app/admin/admin-routing.module.ts (empty path admin) - `) + Open the `AppRoutingModule` and add a new `admin` route to its `appRoutes` array. + Give it a `loadChildren` property (not a `children` property!), set to the address of the `AdminModule`. + The address is the `AdminModule` file location (relative to the app root), + followed by a `#` separator, + followed by the name of the exported module class, `AdminModule`. + ++makeExample('router/ts/app/app-routing.module.5.ts', 'admin-1', 'app-routing.module.ts (load children)') :marked - The `loadChildren` property is used by the `Router` to map to our bundle we want to lazy-load, in this case being the `AdminModule`. + When the router navigates to this route, it uses the `loadChildren` string to dynamically load the `AdminModule`. + Then it adds the `AdminModule` routes to its current route configuration. + Finally, it loads the requested route to the destination admin component. - If we look closer at the `loadChildren` string, we can see that it maps directly to our `admin.module.ts` file where we previously built - out our `Admin` feature area. After the path to the file we use a `#` to denote where our file path ends and to tell the `Router` the name - of our `AdminModule`. If we look in our `admin.module.ts` file, we can see it matches name of our exported module class. - -+makeExcerpt('app/admin/admin.module.ts (export)', 'admin-module-export') - -:marked - The `loadChildren` property is used by the `Router` to map to our bundle we want to lazy-load, in this case being the `AdminModule`. - The router will take our loadChildren string and dynamically load in our `AdminModule`, add its routes to our configuration *dynamically* - and then load the requested route. This will only happen when the route is **first** requested and the module will be immediately be available - for subsequent requests. + The lazy loading and re-configuration happen just once, when the route is _first_ requested; + the module and routes are available immediately for subsequent requests. .l-sub-section :marked - Angular provides a built-in module loader that supports **`SystemJS`** to load modules asynchronously. If we were - using another bundling tool, such as **Webpack**, we would use the Webpack mechanism for asynchronously loading modules. + Angular provides a built-in module loader that supports SystemJS to load modules asynchronously. If you were + using another bundling tool, such as Webpack, you would use the Webpack mechanism for asynchronously loading modules. :marked - We've built our feature area, we've updated our route configuration to take advantage of lazy-loading, now we have to do the final step - to break our `AdminModule` into a completely separate module. In our `app.module.ts`, we'll remove our `AdminModule` from the - `imports` array since we'll be loading it on-demand an we'll remove the imported `AdminModule`. + Take the final step and detach the admin feature set from the main application. + The root `AppModule` must neither load nor reference the `AdminModule` or its files. -+makeExcerpt('app/app.module.7.ts (async admin module)', '') + In the `app.module.ts`, remove the `AdminModule` import statement from the top of the file + and remove the `AdminModule` from the Angular module's `imports` array. -h3#can-load-guard CanLoad Guard: guarding against loading of feature modules +h3#can-load-guard CanLoad Guard: guarding unauthorized loading of feature modules :marked - We're already protecting our `AdminModule` with a `CanActivate` guard that prevents the user from - accessing the admin feature area unless authorized. We're currently loading the admin routing - asynchronously when requested, checking the user access and redirecting to the login page if not - authorized. Ideally, we only want to load the `AdminModule` if the user is logged in and prevent - the `AdminModule` and its routing from being loaded until then. + You're already protecting the `AdminModule` with a `CanActivate` guard that prevents unauthorized users from + accessing the admin feature area. + It redirects to the login page if the user is not authorized. + + But the router is still loading the `AdminModule` even if the user can't visit any of its components. + Ideally, you's only load the `AdminModule` if the user is logged in. - The **CanLoad** guard covers this scenario. + Add a **`CanLoad`** guard that only loads the `AdminModule` once the user is logged in _and_ attempts to access the admin feature area. - We can use the `CanLoad` guard to only load the `AdminModule` once the user is logged in **and** attempts - to access the admin feature area. We'll update our existing `AuthGuard` to support the `CanLoad` guard. We'll import - the `CanLoad` interface and the `Route` the guard provides when called that contains the requested path. - - We'll add the interface to our service, and then we'll implement the interface. Since our `AuthGuard` already - checks the user's logged in state, we can pass that access check to our `canLoad` method. The `Route` in - the `canLoad` method provides a **path** which comes from our route configuration. - -+makeExcerpt('app/auth-guard.service.ts (can load guard)', '') + The existing _`AuthGuard`_ already has the essential logic, in its `checkLogin` method, to support the `CanLoad` guard. + + Open the `auth-guard.service.ts`. + Import the `CanLoad` interface from '@angular/router'. + Add it to the `AuthGuard` class's `implements` list. + Then implement `canLoad` as follows: ++makeExcerpt('app/auth-guard.service.ts (CanLoad guard)', 'canLoad') :marked - Next, we'll import the `AuthGuard` into our `app-routing.module.ts` and add the `AuthGuard` to the `canLoad` array for - our `admin` route. Now our `admin` feature area is only loaded when the proper access has been granted. + The router sets the `canLoad` methods `route` parameter to the intended destination URL. + The `checkLogin` method redirects to that URL once the user has logged in. -+makeExcerpt('app/app-routing.module.5.ts (can load guard)', 'can-load-guard') + Now import the `AuthGuard` into the `AppRoutingModule` and add the `AuthGuard` to the `canLoad` array for the `admin` route. + The completed admin route looks like this. -h3#preloading Pre-Loading: background loading of feature areas ++makeExample('router/ts/app/app-routing.module.5.ts', 'admin', 'app-routing.module.ts (lazy admin route)') + + +h3#preloading Preloading: background loading of feature areas :marked - We've learned how to load modules on-demand, but we can also take advantage of loading feature areas modules in *advance*. The *Router* - supports **pre-loading** of asynchronous feature areas prior to navigation to their respective URL. Pre-loading allows us to to load our initial route - quickly, while other feature modules are loaded in the background. Once we navigate to those areas, they will have already been loaded - as if they were included in our initial bundle. + You've learned how to load modules on-demand. + You can also load modules asynchronously with _preloading_. - Each time a **successful** navigation happens, the *Router* will look through our configuration for lazy loaded feature areas - and react based on the provided strategy. + This may seem like what the app has been doing all along. Not quite. + The `AppModule` for instance is loaded when the application starts; that's _eager_ loading. + Now the `AdminModule` loads only when the user clicks on a link; that's _lazy_ loading. + + _Preloading_ is something in between. + Consider the _Crisis Center_. + It isn't the first view that a user sees. + By default, the _Heroes_ are the first view. + For the smallest initial payload and fastest launch time, + you should eagerly load the `AppModule` and the `HeroesModule`. - The *Router* supports two pre-loading strategies by default: + You could lazy load the _Crisis Center_. + But you're almost certain that the user will visit the _Crisis Center_ within minutes of launching the app. + Ideally, the app would launch with just the `AppModule` and the `HeroesModule` loaded + and then, almost immediately, load the `CrisisCenterModule` in the background. + By the time the user navigates to the _Crisis Center_, its module will have been loaded and ready to go. - * No pre-loading at all which is the default. Lazy loaded feature areas are still loaded on demand. - * Pre-loading of all lazy loaded feature areas. + That's _preloading_. - The *Router* also supports [custom preloading strategies](#custom-preloading) for fine control over which modules to pre-load. + #### How it works + After each _successful_ navigation, the router looks in its configuration for an unloaded module that it can preload. + Whether it preloads a module and which modules it preloads depends upon the *preload strategy*. - We'll update our *CrisisCenterModule* to be loaded lazily by default and use the `PreloadAllModules` strategy - to load _all_ lazy loaded modules as soon as possible. + The `Router` offers two preloading strategies out of the box: - -.l-sub-section - :marked - The **PreloadAllModules** strategy does not load feature areas protected by a [CanLoad](#can-load-guard) guard and this is by design. - The *CanLoad* guard blocks loading of feature module assets until authorized to do so. If you want to both preload a module and guard - against unauthorized access, use the [CanActivate](#can-activate-guard) guard instead. + * No preloading at all which is the default. Lazy loaded feature areas are still loaded on demand. + * Preloading of all lazy loaded feature areas. -:marked - We'll update our route configuration to lazy load the *CrisisCenterModule*. We follow the same process as we did when we loaded the *AdminModule* asynchronously. - In the *crisis-center-routing.module.ts*, we'll change the *crisis-center* path to an *empty path* route. + Out of the box, the router either never preloads, or preloads every lazy-load module. + The `Router` also supports [custom preloading strategies](#custom-preloading) for fine control over which modules to preload and when. - We'll move our redirect and *crisis-center* route to our `AppRoutingModule` routes and use the `loadChildren` string to load the *CrisisCenterModule*. - The redirect is also changed to load the `/heroes` route on initial load. + In this next section, you'll update the `CrisisCenterModule` to load lazily by default and use the `PreloadAllModules` strategy + to load it (and _all other_ lazy loaded modules) as soon as possible. - Once we're finished, we'll remove the `CrisisCenterModule` from our `AppModule`'s imports. + #### Lazy load the _Crisis Center_ + Update the route configuration to lazy load the `CrisisCenterModule`. + Take the same steps you used to configure `AdminModule` for lazy load. + + 1. Change the `crisis-center` path in the `CrisisCenterRoutingModule` to an empty string. + + 1. Add a `crisis-center` route to the `AppRoutingModule`. + + 1. Set the `loadChildren` string to load the `CrisisCenterModule`. + + 1. Remove all mention of the `CrisisCenterModule` from `app.module.ts`. Here are the updated modules _before enabling preload_: @@ -2342,76 +2415,109 @@ h3#preloading Pre-Loading: background loading of feature areas app-routing.module.ts, crisis-center-routing.module.ts `) - :marked + You could try this now and confirm that the `CrisisCenterModule` loads after you click the "Crisis Center" button. + + To enable preloading of all lazy loaded modules, import the `PreloadAllModules` token from the Angular router package. + The second argument in the `RouterModule.forRoot` method takes an object for additional configuration options. - We import the `PreloadAllModules` token from the router package and set the configuration option's `preloadingStrategy` property - with this `PreloadAllModules` token. - This tells the built-in *Router* pre-loader to immediately load **all** [unguarded](#preload-canload) feature areas that use `loadChildren`. - -+makeExcerpt('app/app-routing.module.6.ts (preload all)', '') - + The `preloadingStrategy` is one of those options. + Add the `PreloadAllModules` token to the `forRoot` call: ++makeExcerpt('app/app-routing.module.6.ts (preload all)', 'forRoot') :marked - Now when we visit `http://localhost:3000`, the `/heroes` route will load in the foreground, while the *CrisisCenterModule* and any other asynchronous feature - modules are _eagerly_ loaded in the background, waiting for us to navigate to them. + This tells the `Router` preloader to immediately load _all_ lazy-loaded routes (routes with a `loadChildren` property). - + When you visit `http://localhost:3000`, the `/heroes` route loads immediately upon launch. + and the router starts loading the `CrisisCenterModule` right after the `HeroesModule` loads. + + Surprisingly, the `AdminModule` does _not_ preload. Something is blocking it. + +a#preload-canload :marked - ### Custom Pre-Loading Strategy + #### CanLoad blocks preload + The `PreloadAllModules` strategy does not load feature areas protected by a [CanLoad](#can-load-guard) guard. + This is by design. + + You added a `canLoad` guard to the route to the `AdminModule` a few steps back + to block loading of that module until the user is authorized. + That `canLoad` guard takes precedence over the preload strategy. + + If you want both to preload a module and guard against unauthorized access, + drop the `canLoad` guard and rely on the [CanActivate](#can-activate-guard) guard alone. - Pre-loading all modules works well in some situations, but in some cases we need more control over what gets loaded eagerly. This becomes more clear - as we load our application on a mobile device, or a low bandwidth connection. We may only want to preload certain feature modules based on user metrics - or other data points we gather over time. The *Router* lets us have more control with a **custom** preloading strategy. +a#custom-preloading +:marked + ### Custom Preloading Strategy - We can define our own strategy the same way the **PreloadAllModules** modules strategy was provided to our *RouterModule.forRoot* configuration object. + Preloading every lazy loaded modules works well in many situations, + but it isn't always the right choice, especially on mobile devices and over low bandwidth connections. + You may choose to preload only certain feature modules, based on user metrics and other business and technical factors. - Since we want to take advantage of this, we'll add a custom strategy that _only_ preloads the modules we select. We'll enable the preloading by using the *Route Data*, - which, as we learned, is an object to store arbitrary route data and and [resolve data](#resolve-guard). + You can control what and how the router preloads with a custom preloading strategy. - We'll add a custom `preload` boolean to our `crisis-center` route data that we'll use with our custom strategy. To see it in action, we'll add - the `route.path` to the `preloadedModules` array in our custom strategy service. We'll also log a message - to the console for the preloaded module. + In this section, you'll add a custom strategy that _only_ preloads routes whose `data.preload` flag is set to `true`. + Recall that you can add anything to the `data` property of a route. + + Set the `data.preload` flag in the `crisis-center` route in the `AppRoutingModule`. +makeExcerpt('app/app-routing.module.ts (route data preload)', 'preload-v2') :marked - To create our custom strategy we'll need to implement the abstract `PreloadingStrategy` class and the `preload` method. The `preload` method is called for each route - that loads its feature module asynchronously and determines whether to preload it. The `preload` method takes two arguments, the first being the `Route` that provides - the route configuration and a function that preloads the feature module. - - We'll name our strategy **PreloadSelectedModules** since we _only_ want to preload based on certain criteria. Our custom strategy looks for the **`preload`** boolean - value in our `Route Data` and if its true, it calls the `load` function provided by the built-in `Router` pre-loader that eagerly loads feature modules. - -+makeExcerpt('app/selective-preload-strategy.ts (preload selected modules)', '') + Add a new file to the project called `selective-preloading-strategy.ts` + and define a `SelectivePreloadingStrategy` service class as follows: ++makeExcerpt('app/selective-preloading-strategy.ts', '') :marked - In order to use our custom preloading strategy, we import it into our `app-routing.module.ts` and replace the `PreloadAllModules` strategy. We also add - the `PreloadSelectedModules` strategy to the `AppRoutingModule` providers array. This allows the *Router* pre-loader to inject our custom strategy. + `SelectivePreloadingStrategy` implements the `PreloadingStrategy`, which has one method, `preload`. - To confirm our *CrisisCenterModule* is being pre-loaded, we'll display our `preloadedModules` in the `Admin` dashboard. We already know how to use - an *ngFor* loop, so we'll skip over the details here. Since the `PreloadSelectedModules` is just a service, we can inject it into the `AdminDashboardComponent` - and wire it up to our list. + The router calls the `preload` method with two arguments + 1. The route to consider. + 1. A loader function that can load the routed module asynchronously. + + An implementation of `preload`must return an `Observable`. + If the route should preload, it returns the observable returned by calling the loader function. + If the route should _not_ preload, it returns an `Observable` of `null`. + + In this sample, the `preload` method loads the route if the route's `data.preload` flag is truthy. + + It also has a side-effect. + `SelectivePreloadingStrategy` logs the `path` of a selected route in its public `preloadedModules` array. + + Shortly, you'll extend the `AdminDashboardComponent` to inject this service and display its `preloadedModules` array. + + But first, make a few changes to the `AppRoutingModule`. + 1. Import `SelectivePreloadingStrategy` into . + 1. Replace the `PreloadAllModules` strategy in the call to `forRoot` with this `SelectivePreloadingStrategy`. + 1. Add the `SelectivePreloadingStrategy` strategy to the `AppRoutingModule` providers array so it can be injected + elsewhere in the app. + + Now edit the `AdminDashboardComponent` to display the log of preloaded routes. + 1. Import the `SelectivePreloadingStrategy` (it's a service) + 1. Inject it into the dashboard's constructor. + 1. Update the template to display the strategy service's `preloadedModules` array. + + When you're done it looks like this. +makeExcerpt('app/admin/admin-dashboard.component.ts (preloaded modules)', '') :marked - Once our application is loaded to our initial route, the *CrisisCenterModule* is loaded eagerly. We can verify this by logging in to the `Admin` feature area and - noting that the `crisis-center` is listed in the `Preloaded Modules` and logged to the console. We can continue to add feature modules to be selectively loaded eagerly. - + Once the application loads the initial route, the `CrisisCenterModule` is preloaded. + Verify this by logging in to the `Admin` feature area and noting that the `crisis-center` is listed in the `Preloaded Modules`. + It's also logged to the browser's console. .l-main-section :marked ## Wrap Up - We've covered a lot of ground in this chapter and the application is too big to reprint here. - Please visit the and + We've covered a lot of ground in this guide and the application is too big to reprint here. + Please visit the and where you can download the final source code. .l-main-section :marked ## Appendices - The balance of this chapter is a set of appendices that - elaborate some of the points we covered quickly above. + The balance of this guide is a set of appendices that + elaborate some of the points you covered quickly above. The appendix material isn't essential. Continued reading is for the curious. @@ -2419,96 +2525,66 @@ h3#preloading Pre-Loading: background loading of feature areas :marked ## Appendix: Link Parameters Array - We've mentioned the *Link Parameters Array* several times. We've used it several times. + The _link parameters array_ has been mentioned several times and used in several places. A link parameters array holds the ingredients for router navigation: * the *path* of the route to the destination component * required and optional route parameters that go into the route URL - We can bind the `RouterLink` directive to such an array like this: + You can bind the `RouterLink` directive to such an array like this: +makeExcerpt('app/app.component.3.ts', 'h-anchor', '') :marked - We've written a two element array when specifying a route parameter like this + You've written a two element array when specifying a route parameter like this +makeExcerpt('app/heroes/hero-list.component.1.ts', 'nav-to-detail', '') :marked - We can provide optional route parameters in an object like this: + You can provide optional route parameters in an object like this: +makeExcerpt('app/app.component.3.ts', 'cc-query-params', '') :marked - These three examples cover our needs for an app with one level routing. - The moment we add a child router, such as the *Crisis Center*, we create new link array possibilities. + These three examples cover the need for an app with one level routing. + The moment you add a child router, such as the *Crisis Center*, you create new link array possibilities. - Recall that we specified a default child route for *Crisis Center* so this simple `RouterLink` is fine. + Recall that you specified a default child route for *Crisis Center* so this simple `RouterLink` is fine. +makeExcerpt('app/app.component.3.ts', 'cc-anchor-w-default', '') :marked - Let's parse it out. + Parse it out. * The first item in the array identifies the parent route ('/crisis-center'). - * There are no parameters for this parent route so we're done with it. - * There is no default for the child route so we need to pick one. - * We decide to go to the `CrisisListComponent` whose route path is '/' but we don't need to explicitly add it + * There are no parameters for this parent route so you're done with it. + * There is no default for the child route so you need to pick one. + * You're navigating to the `CrisisListComponent`, whose route path is '/', but you don't need to explicitly add the slash * Voila! `['/crisis-center']`. - Let's take it a step further. - This time we'll build a link parameters array that navigates from the root of the application + Take it a step further. + This time you'll build a link parameters array that navigates from the root of the application down to the "Dragon Crisis". * The first item in the array identifies the parent route ('/crisis-center'). - * There are no parameters for this parent route so we're done with it. + * There are no parameters for this parent route so you're done with it. * The second item identifies the child route for details about a particular crisis ('/:id'). * The details child route requires an `id` route parameter - * We add `id` of the *Dragon Crisis* as the second item in the array (`1`) + * You added the `id` of the *Dragon Crisis* as the second item in the array (`1`) It looks like this! +makeExcerpt('app/app.component.3.ts', 'Dragon-anchor', '') :marked - If we wanted to, we could redefine our `AppComponent` template with *Crisis Center* routes exclusively: + If you wanted to, you could redefine the `AppComponent` template with *Crisis Center* routes exclusively: +makeExcerpt('app/app.component.3.ts', 'template', '') :marked - In sum, we can write applications with one, two or more levels of routing. + In sum, you can write applications with one, two or more levels of routing. The link parameters array affords the flexibility to represent any routing depth and any legal sequence of route paths, (required) router parameters and (optional) route parameter objects. -.l-main-section#onInit -:marked - ## Appendix: Why use an *ngOnInit* method - - We implemented an `ngOnInit` method in many of our Component classes. - We did so, for example, in the [HeroDetailComponent](#hero-detail-ctor). - We might have put the `ngOnInit` logic inside the constructor instead. We didn't for a reason. The reason is *testability*. - - A constructor that has major side-effects can be difficult to test because it starts doing things as soon as - we create a test instance. In this case, it might have made a request to a remote server, something it shouldn't - do under test. It may even be impossible to reach the server in the test environment. - - The better practice is to limit what the constructor can do. Mostly it should stash parameters in - local variables and perform simple instance configuration. - - Yet we want an instance of this class to get the hero data from the `HeroService` soon after it is created. - How do we ensure that happens if not in the constructor? - - Angular detects when a component has certain lifecycle methods like - [ngOnInit](../api/core/index/OnInit-class.html) and - [ngOnDestroy](../api/core/index/OnDestroy-class.html) and calls - them - at the appropriate moment. - - Angular will call `ngOnInit` when we navigate to the `HeroDetailComponent`, we'll get the `id` from the `ActivatedRoute` - params and ask the server for the hero with that `id`. - - We too can call that `ngOnInit` method in our tests if we wish ... after taking control of the injected - `HeroService` and (perhaps) mocking it. - a#browser-url-styles .l-main-section#location-strategy :marked @@ -2542,20 +2618,20 @@ code-example(format=".", language="bash"). The `RouterModule.forRoot` function sets the `LocationStrategy` to the `PathLocationStrategy`, making it the default strategy. - We can switch to the `HashLocationStrategy` with an override during the bootstrapping process if we prefer it. + You can switch to the `HashLocationStrategy` with an override during the bootstrapping process if you prefer it. .l-sub-section :marked Learn about "providers" and the bootstrap process in the - [Dependency Injection chapter](dependency-injection.html#bootstrap) + [Dependency Injection guide](dependency-injection.html#bootstrap) :marked ### Which Strategy is Best? - We must choose a strategy and we need to make the right call early in the project. + You must choose a strategy and you need to make the right call early in the project. It won't be easy to change later once the application is in production and there are lots of application URL references in the wild. Almost all Angular projects should use the default HTML 5 style. It produces URLs that are easier for users to understand. - And it preserves the option to do **server-side rendering** later. + And it preserves the option to do _server-side rendering_ later. Rendering critical pages on the server is a technique that can greatly improve perceived responsiveness when the app first loads. @@ -2571,13 +2647,13 @@ code-example(format=".", language="bash"). ### HTML 5 URLs and the *<base href>* While the router uses the "[HTML 5 pushState](https://developer.mozilla.org/en-US/docs/Web/API/History_API#Adding_and_modifying_history_entries)" - style by default, we *must* configure that strategy with a **base href** + style by default, you *must* configure that strategy with a **base href** The preferred way to configure the strategy is to add a [<base href> element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base) tag in the `` of the `index.html`. -+makeExcerpt('index.1.html', 'base-href', '') ++makeExcerpt('index.html', 'base-href', '') :marked Without that tag, the browser may not be able to load resources @@ -2591,7 +2667,7 @@ code-example(format=".", language="bash"). Those developers may still use HTML 5 URLs by taking two remedial steps: 1. Provide the router with an appropriate `APP_BASE_HREF` value. - 1. Use **absolute URLs** for all web resources: css, images, scripts, and template html files. + 1. Use _root URLs_ for all web resources: css, images, scripts, and template html files. .l-sub-section :marked @@ -2599,8 +2675,8 @@ code-example(format=".", language="bash"). in the API Guide. :marked ### *HashLocationStrategy* - We can go old-school with the `HashLocationStrategy` by + You can go old-school with the `HashLocationStrategy` by providing the `useHash: true` in an object as the second argument of the `RouterModule.forRoot` - in our `AppModule`. + in the `AppModule`. +makeExcerpt('app/app.module.6.ts (hash URL strategy)', '') diff --git a/public/resources/images/devguide/router/complete-nav.png b/public/resources/images/devguide/router/complete-nav.png deleted file mode 100644 index fe48e8ab89b4a6f3500eb01c18fd5db55fd9c432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42130 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 AdjJ3c diff --git a/public/resources/images/devguide/router/contact-popup.png b/public/resources/images/devguide/router/contact-popup.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0a20fba3f159d7deb5c63de8583785590019af GIT binary patch literal 3996 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 J=qGmJ{{hL3Xbk`W literal 0 HcmV?d00001 diff --git a/public/resources/images/devguide/router/crisis-center-detail.png b/public/resources/images/devguide/router/crisis-center-detail.png index 2e2680dcea5df927d082759500952ef5b49eb599..605b781dd44ca07b705e091c44472b7922b2d006 100644 GIT binary patch literal 14332 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 iZjV(A+a&*sPXY diff --git a/public/resources/images/devguide/router/crisis-center-list.png b/public/resources/images/devguide/router/crisis-center-list.png index 7838aea55962b534f7e8168646bf581a8338aa12..5500d4e28c372380862504c25ca8bb97137644e9 100644 GIT binary patch literal 11488 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 A(f|Me literal 14980 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 diff --git a/public/resources/images/devguide/router/hero-detail.png b/public/resources/images/devguide/router/hero-detail.png index de88f3a587492746f5f7272d5046492ec39b1b3b..6e9cfda662d74f87820c9bb16f7e7d1fd23f23ba 100644 GIT binary patch literal 5531 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 JDv*8Te*pj~&lmsz literal 7145 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 OZ>cG3DOD+0e)$j44Q4<9 literal 11956 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 diff --git a/public/resources/images/devguide/router/router-anim.gif b/public/resources/images/devguide/router/router-anim.gif deleted file mode 100644 index 01a6345d54df854b97de622a7eb797bc70db5703..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233557 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 G{{I2rf~FAw