Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Der Router in Angular im Detail betrachtet

Der Router in Angular im Detail betrachtet

Folien von Vortrag von BASTA! Spring 2017 in Frankfurt

Manfred Steyer

February 22, 2017
Tweet

More Decks by Manfred Steyer

Other Decks in Programming

Transcript

  1. Über mich … • Manfred Steyer • SOFTWAREarchitekt.at • Trainer

    & Consultant • Focus: Angular • Google Developer Expert (GDE) Page  2 Manfred Steyer
  2. Warum Routing? • SPAs bestehen aus einer Seite • Seiten

    simulieren  Routen • Url sollte auf Route hinweisen • Bookmarks • Back-Button • Router unterstützen hierbei Page  7
  3. Routing unter AngularJS Page  9 Logo + Menü Menü

    2 Fußzeile SPA Passagier- Komponente /FlugDemo#passagier
  4. Routing unter AngularJS Page  10 Logo + Menü Menü

    2 Fußzeile SPA Passagier- Komponente /FlugDemo/passagier
  5. Routen als Url-Segmente • /FlugDemo/passagier • History API • Gesamte

    Url wird zum Server gesendet • Server antwortet mit SPA • Server kann erste Ansicht "vorrendern" • Performance, SEO, … • Festlegen der Grenze zwischen URL und Route bei History API: • <base href="/FlugDemo"> • Oder: Token APP_BASE_HREF (@angular/common) Page  11
  6. Konfiguration Page  12 const APP_ROUTES: Routes = [ {

    path: 'home', component: HomeComponent }, { path: 'flug-suchen', component: FlugSuchenComponent }, { path: '**', redirectTo: 'home' } ]
  7. Konfiguration Page  13 export const AppRoutesModule = RouterModule.forRoot(ROUTE_CONFIG); //

    app.module.ts @NgModule({ imports: [ BrowserModule, HttpModule, FormsModule, AppRoutesModule ], […] }) export class AppModule { } Für Root-Module Für Feature-Module: forChild
  8. Parameter Page  18 const APP_ROUTES: Routes = [ […]

    { path: 'flug-suchen', component: FlugSuchenComponent }, { path: 'flug-edit/:id', component: FlugEditComponent } }
  9. Parameter auslesen Page  19 export class FlugEditComponent { public

    id: string; constructor( private route: ActivatedRoute) { route.params.subscribe( p => { this.id = p['id']; […] } ); } […] }
  10. Hierarchische Views Page  24 Logo + Menü Menü 2

    Fußzeile SPA /FlugDemo/flugbuchen FlugBuchen-Komponente
  11. Hierarchische Views Page  25 Logo + Menü Menü 2

    Fußzeile SPA Optionen Platzhalter FlugBuchen-Komponente /FlugDemo/flugbuchen
  12. Hierarchische Views Page  26 Logo + Menü Menü 2

    Fußzeile SPA Optionen Passagier- Komponente FlugBuchen-Komponente /FlugDemo/flugbuchen/passagier
  13. Konfiguration Page  27 const FLIGHT_ROUTES: Routes = [ […]

    { path: 'flug-buchen', component: FlugBuchenComponent, children: [ { path: 'flug-suchen', component: FlugSuchenComponent }, […] ] } ];
  14. DEMO Page  28 App Home Flug buchen Flug suchen

    Flug editieren Passagier suchen
  15. Aux-Routes Page  30 Logo + Menu Menu 2 Footer

    SPA Placeholder Named Placeholder
  16. Aux-Routes Page  31 Logo + Menu Menu 2 Footer

    SPA Flight- Component Named Placeholder /FlightApp/flights
  17. Aux-Routes Page  32 Logo + Menu Menu 2 Footer

    SPA Flight- Component Info-Component /FlightApp/flights(aux:info)
  18. Aux-Routes Page  33 Logo + Menu Menu 2 Footer

    SPA Flight- Component Modal-Component /FlightApp/flights(aux:info/modal)
  19. Aux-Routes Page  34 Logo + Menu Menu 2 Footer

    SPA Flight-Edit- Component Modal-Component /FlightApp/flights(aux:info/modal)/17
  20. Konfiguration Page  37 export const ROUTE_CONFIG: Routes = [

    { path: 'home', component: HomeComponent }, { path: 'info', component: InfoComponent, outlet: 'aux' }, { path: 'dashboard', component: DashboardComponent, outlet: 'aux' } ]
  21. Aux-Routes routen Page  38 <a [routerLink]="[{outlets: { aux: 'info'

    }}]"> Activate Info </a> <a [routerLink]="[{outlets: { aux: null }}]"> Deactivate Info </a>
  22. Programmatisch routen Page  39 export class AppComponent { constructor(private

    router: Router) { } activateInfo() { this.router.navigate([{outlets: { aux: 'info' }}]); } deactivateInfo() { this.router.navigate([{outlets: { aux: null }}]); } }
  23. Was sind Guards? • Services • Werden beim Aktivieren bzw.

    Deaktivieren einer Route aktiv • Können Aktivierung und Deaktivierung verhindern Page  42
  24. Guards in der Konfiguration Page  45 const APP_ROUTES: Routes

    = [ { path: '/flug-buchen', component: FlugBuchenComponent, canActivate: [AuthGuard], children: [ { path: 'flug-edit/:id', component: FlugEditComponent, canDeactivate: [FlugEditGuard] }, […] ] ] Token
  25. Provider für Guards Page  46 export const ROUTER_PROVIDERS =

    [ { provide: FlugEditGuard, useClass: AdvFlightEditGuard } { provide: AuthGuard, useClass: AdvAuthGuard } ];
  26. Provider für Guards Page  47 export const ROUTER_PROVIDERS =

    [ FlugEditGuard, AuthGuard ]; // app.module.ts @NgModule({ providers: [ ROUTER_PROVIDERS ], […] }) export class AppModule { }
  27. Root Module mit Lazy Loading Page  56 const APP_ROUTE_CONFIG:

    Routes = [ { path: 'home', component: HomeComponent }, { path: 'flights', loadChildren: './[…]flight-booking.module#FlightBookingModule' } ];
  28. Routen für Feature Module Page  57 const FLUG_ROUTES =

    [ { path: '', component: FlugBuchenComponent, […] }, […] } export const FlugRouterModule = RouterModule.forChild(FLUG_ROUTES);
  29. 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  61
  30. Preloading aktivieren Page  62 export const AppRoutesModule = RouterModule.forRoot(

    ROUTE_CONFIG, { preloadingStrategy: PreloadAllModules });
  31. Lazy Loading und Shared Modules Page  64 AppModule FlugModule

    SharedModule includes includes (lazy) includes
  32. Lazy Loading und Shared Modules Page  65 AppModule FlugModule

    SharedModule includes includes (lazy) includes AuthService AuthService
  33. Lazy Loading und Shared Modules Page  66 AppModule FlugModule

    SharedModule includes includes (lazy) includes AuthService AuthService
  34. Lösung Page  67 AppModule FlugModule SharedModule includes (lazy) includes

    CoreModule includes includes Core-Module soll nur ins AppModule eingebunden werden Globale Provider, wie AuthService & Shell
  35. Lösung (für Libraries) Page  70 AppModule FlugModule AuthModule includes

    (lazy) includes (mit Services) CoreModule includes includes (ohne Services) Shell