Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Advanced Routing @AngularDays Spring 2022
Search
Manfred Steyer
PRO
March 23, 2022
Programming
230
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Advanced Routing @AngularDays Spring 2022
Manfred Steyer
PRO
March 23, 2022
More Decks by Manfred Steyer
See All by Manfred Steyer
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
370
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
170
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
250
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
270
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
180
Agentic UI
manfredsteyer
PRO
0
280
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
320
Agentic UI beyond Chats Architecture Patterns & Open Standards @ngMunich 05/2026
manfredsteyer
PRO
0
270
Agentic AI in the Frontend: Architectures with Open Standards @iJS London 2026
manfredsteyer
PRO
0
200
Other Decks in Programming
See All in Programming
リアルな遅延を測る仕様
kota_yata
1
120
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
210
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
720
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
220
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
Android CLI
fornewid
0
220
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
5
1.9k
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.9k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
1k
数百円から始めるRuby電子工作
tarosay
0
160
What's New in Android 2026
veronikapj
0
260
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
1k
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
470
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
480
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
A Soul's Torment
seathinner
6
3.4k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Building an army of robots
kneath
306
46k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
500
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Transcript
@ManfredSteyer Advanced Routing Manfred Steyer ANGULARarchitects.io ManfredSteyer
@ManfredSteyer Routen sind der Dreh- und Angelpunkt Ihrer Angular-Anwendung!
@ManfredSteyer Inhalt • Basics: Kurze Wiederholung • Hierarchisches Routing •
Aux Routes • Guards • Resolver • Router Events • Lazy Loading und Preloading Page ▪ 3
@ManfredSteyer Manfred Steyer
@ManfredSteyer Angular Router Page ▪ 5
@ManfredSteyer Routing in Angular Page ▪ 6 Logo + Menü
Menü 2 Fußzeile SPA Platzhalter
@ManfredSteyer Routing in Angular Page ▪ 7 Logo + Menü
Menü 2 Fußzeile SPA Passagier- Komponente /FlugDemo/passagier
@ManfredSteyer Konfiguration Page ▪ 13 const APP_ROUTES: Routes = [
{ path: 'home', component: HomeComponent }, { path: 'flug-suchen', component: FlugSuchenComponent } ]
@ManfredSteyer Konfiguration Page ▪ 16 // app.module.ts @NgModule({ imports: [
BrowserModule, HttpModule, FormsModule, RouterModule.forRoot(APP_ROUTES); ], […] }) export class AppModule { } Für Root-Module Für Feature-Module: forChild
@ManfredSteyer View von AppComponent Page ▪ 19 <a routerLink="/home">Home</a> <a
routerLink="/flug-suchen">Flug suchen</a> <div> <router-outlet></router-outlet> </div>
@ManfredSteyer DEMO Page ▪ 26
@ManfredSteyer Hierarchisches Routing Page ▪ 27
@ManfredSteyer Hierarchische Views Page ▪ 28 Logo + Menü Menü
2 Fußzeile SPA Platzhalter 1
@ManfredSteyer Hierarchische Views Page ▪ 29 Logo + Menü Menü
2 Fußzeile SPA /FlugDemo/flugbuchen FlugBuchen-Komponente
@ManfredSteyer Hierarchische Views Page ▪ 30 Logo + Menü Menü
2 Fußzeile SPA Optionen Platzhalter FlugBuchen-Komponente /FlugDemo/flugbuchen
@ManfredSteyer Hierarchische Views Page ▪ 31 Logo + Menü Menü
2 Fußzeile SPA Optionen Passagier- Komponente FlugBuchen-Komponente /FlugDemo/flugbuchen/passagier
@ManfredSteyer Konfiguration Page ▪ 32 const APP_ROUTES: Routes = [
{ path: 'flug-buchen', component: FlugBuchenComponent, children: [ { path: 'flug-suchen', component: FlugSuchenComponent }, […] ] } ];
@ManfredSteyer DEMO Page ▪ 33 App Home Flug buchen Flug
suchen Flug editieren Passagier suchen Ihre Buchungen
@ManfredSteyer Aux-Routes Page ▪ 36
@ManfredSteyer Aux-Routes Page ▪ 37 Logo + Menu Menu 2
Footer SPA Placeholder Named Placeholder
@ManfredSteyer Aux-Routes Page ▪ 38 Logo + Menu Menu 2
Footer SPA Flight- Component Named Placeholder /FlightApp/flights
@ManfredSteyer Aux-Routes Page ▪ 39 Logo + Menu Menu 2
Footer SPA Flight- Component Info-Component /FlightApp/flights(aux:info)
@ManfredSteyer Aux-Routes Page ▪ 40 Logo + Menu Menu 2
Footer SPA Flight- Component Modal-Component /FlightApp/flights(aux:info/modal)
@ManfredSteyer Aux-Routes Page ▪ 41 Logo + Menu Menu 2
Footer SPA Flight-Edit- Component Modal-Component /FlightApp/flights(aux:info/modal)/17
@ManfredSteyer Use Cases • Modale Dialoge • “Applets” und teilautonome
Bereiche • Commander-Style Page ▪ 42
@ManfredSteyer Platzhalter definieren Page ▪ 43 <router-outlet></router-outlet> <hr> <router-outlet name="aux"></router-outlet>
Standard-Name: primary
@ManfredSteyer Konfiguration Page ▪ 44 export const ROUTE_CONFIG: Routes =
[ { path: 'home', component: HomeComponent }, { path: 'info', component: InfoComponent, outlet: 'aux' }, { path: 'dashboard', component: DashboardComponent, outlet: 'aux' } ]
@ManfredSteyer Aux-Routes routen Page ▪ 45 <a [routerLink]="[{outlets: { aux:
'info' }}]"> Activate Info </a> <a [routerLink]="[{outlets: { aux: null }}]"> Deactivate Info </a>
@ManfredSteyer Mehrere Outlets gleichzeitig bestücken <a [routerLink]="[{outlets: { aux: 'basket',
primary: 'flight-booking/flight-search' }}]"> … </a> <a [routerLink]="[{outlets: { aux: 'basket', primary: ['flight-booking', 'flight-search'] }}]"> … </a> <a [routerLink]="[{outlets: { aux: 'basket', primary: ['flight-booking', 'flight-edit', 17] }}]"> … </a>
@ManfredSteyer Programmatisch routen Page ▪ 47 export class AppComponent {
constructor(private router: Router) { } activateInfo() { this.router.navigate([{outlets: { aux: 'info' }}]); } deactivateInfo() { this.router.navigate([{outlets: { aux: null }}]); } }
@ManfredSteyer DEMO Page ▪ 48
@ManfredSteyer Guards Page ▪ 49
@ManfredSteyer Was sind Guards? • Services • Können Aktivierung und
Deaktivierung von Routen verhindern Page ▪ 50
@ManfredSteyer Guards Rückgabewert: boolean | Observable<boolean> | Promise<boolean> CanActivate canActivate
CanActivateChild canActivateChild CanLoad canLoad CanDeactivate<T> canDeactivate
@ManfredSteyer Guards in der Konfiguration Page ▪ 53 const APP_ROUTES:
Routes = [ { path: '/flug-buchen', component: FlugBuchenComponent, canActivate: [AuthGuard], children: [ { path: 'flug-edit/:id', component: FlugEditComponent, canDeactivate: [FlugEditGuard] }, […] ] ]
@ManfredSteyer Provider für Guards Page ▪ 56 // app.module.ts @NgModule({
providers: [ FlugEditGuard, AuthGuard ], […] }) export class AppModule { }
@ManfredSteyer DEMO Page ▪ 57
@ManfredSteyer Resolver
@ManfredSteyer Was sind Resolver? • Services • Werden beim Routenwechsel
aktiv • Verzögern Aktivierung der neuen Route • Laden benötigte Daten • Zwischenzeitlich kann z. B. Loading Indikator angezeigt werden
@ManfredSteyer Resolver @Injectable() export class FlightResolver implements Resolve<Flight> { constructor(private
flightService: FlightService) { } resolve(route, state): Observable<Flight> | Promise<Flight> | Flight { return […] } }
@ManfredSteyer Resolver registrieren const FLIGHT_BOOKING_ROUTES: Routes = [ […] {
path: 'flight-edit/:id', component: FlightEditComponent, resolve: { flight: FlightResolver } } ];
@ManfredSteyer Daten entgegennehmen @Component({ … }) export class FlightEditComponent {
flight: Flight; constructor(private route: ActivatedRoute) { } ngOnInit() { this.route.data.subscribe( data => { this.flight = data['flight']; } ); } }
@ManfredSteyer DEMO
@ManfredSteyer Lazy Loading Page ▪ 65
@ManfredSteyer Warum Lazy Loading? • Module erst bei Bedarf nachladen
• Verbesserung der Start-Performance Page ▪ 66
@ManfredSteyer Root Module mit Lazy Loading Page ▪ 67 const
APP_ROUTE_CONFIG: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'flights', loadChildren: '[…]flight-booking.module#FlightBookingModule' } ];
@ManfredSteyer Root Module mit Lazy Loading Page ▪ 68 const
APP_ROUTE_CONFIG: Routes = [ { path: '', redirectTo: 'home', pathMatch: 'full' }, { path: 'home', component: HomeComponent }, { path: 'flights', loadChildren: () => import('[…]flight-booking.module') .then(m => m.FlightBookingModule); } ];
@ManfredSteyer Routen für Feature Module Page ▪ 69 const FLUG_ROUTES
= [ { path: '', component: FlugBuchenComponent, […] }, […] }
@ManfredSteyer Routen für Feature Module Page ▪ 70 const FLUG_ROUTES
= [ { path: 'subroute', component: FlugBuchenComponent, […] }, […] }
@ManfredSteyer DEMO Page ▪ 72
@ManfredSteyer Preloading Page ▪ 73
@ManfredSteyer Idee • Eventuell später benötigte Module werden mit freien
Ressourcen vorgeladen • Wird das Modul später tatsächlich benötigt, steht es augenblicklich zur Verfügung Page ▪ 74
@ManfredSteyer Preloading aktivieren Page ▪ 75 export const AppRoutesModule =
RouterModule.forRoot( ROUTE_CONFIG, { preloadingStrategy: PreloadAllModules });
@ManfredSteyer Problem with Lazy Loading and Classic Providers
@ManfredSteyer Lazy Loading and Shared Modules Page ▪ 89 AppModule
FlightBooking Module SharedModule includes includes (lazy) includes AuthService
@ManfredSteyer Lazy Loading and Shared Modules Page ▪ 90 AppModule
FlightBooking Module SharedModule includes includes (lazy) includes AuthService AuthService
@ManfredSteyer Lazy Loading and Shared Modules Page ▪ 91 AppModule
FlightBooking Module SharedModule includes includes (lazy) includes AuthService AuthService
@ManfredSteyer Solution 1: CoreModule Page ▪ 92 AppModule FlightBooking Module
SharedModule includes (lazy) includes CoreModule includes includes Core-Module is only imported into the AppModule Global Providers + Shell
@ManfredSteyer Solution 2: forRoot Page ▪ 93 AppModule FlightBooking Module
AuthModule includes (lazy) CoreModule
@ManfredSteyer Solution 2: forRoot Page ▪ 94 AppModule FlightBooking Module
AuthModule includes (lazy) includes (with Services) CoreModule includes includes (without Services)
@ManfredSteyer AuthModule Page ▪ 95 @NgModule({ […], providers: [] })
export class AuthModule { }
@ManfredSteyer AuthModule Page ▪ 96 @NgModule({ […], providers: [] })
export class AuthModule { static forRoot(): ModuleWithProviders<AuthModule> { return { ngModule: AuthModule, providers: [AuthService, […]] } } }
@ManfredSteyer DEMO Page ▪ 97
@ManfredSteyer Solution 3: Tree-shakable Provider Page ▪ 98 @Injectable({ providedIn:
'root' }) export class AuthService { […] }
@ManfredSteyer Tree-Shakable Provider for Lazy Modules
@ManfredSteyer Lazy Modules Page ▪ 100 @Injectable({ providedIn: LazyApiModule })
export class FlightService { […] } Only makes sense with lazy loading !! All "classic" modules: root scope Service is loaded alongside lazy module!
@ManfredSteyer Preventing Cycles
@ManfredSteyer Preventing Cycles
@ManfredSteyer DEMO
@ManfredSteyer Zusammenfassung Child Routes Aux Routes Guards Resolver Lazy Loading
& Preloading
@ManfredSteyer Kontakt and Downloads [mail]
[email protected]
[web] SOFTWAREarchitekt.at [twitter] ManfredSteyer
d Slides & Examples Public and In-House http://www.softwarearchitekt.at/workshops