Frontend Web Development with Angular CC BY-NC-ND Carrot & - - PowerPoint PPT Presentation

frontend web development with angular
SMART_READER_LITE
LIVE PREVIEW

Frontend Web Development with Angular CC BY-NC-ND Carrot & - - PowerPoint PPT Presentation

Frontend Web Development with Angular CC BY-NC-ND Carrot & Company GmbH Agenda Questions Some infos Lecturing Router NgModules Todos CC BY-NC-ND Carrot & Company GmbH Questions? CC BY-NC-ND Carrot


slide-1
SLIDE 1

CC BY-NC-ND Carrot & Company GmbH

Frontend Web Development with Angular

slide-2
SLIDE 2

CC BY-NC-ND Carrot & Company GmbH

Agenda

  • Questions
  • Some infos
  • Lecturing

○ Router ○ NgModules

  • Todos
slide-3
SLIDE 3

CC BY-NC-ND Carrot & Company GmbH

Questions?

slide-4
SLIDE 4

CC BY-NC-ND Carrot & Company GmbH

  • Code comments from us were made for improving your code. If you ignore

them you might lose points in the next sprint.

Some Infos

slide-5
SLIDE 5

CC BY-NC-ND Carrot & Company GmbH

Routing & Navigation

[https://angular.io/guide/router]

slide-6
SLIDE 6

CC BY-NC-ND Carrot & Company GmbH

Today's Topics

  • Routes Configuration
  • Router Link
  • Router Outlet
  • ActivatedRoute
  • Relative Navigation
  • Router Events
  • Route Guards
  • Component-less Route
slide-7
SLIDE 7

CC BY-NC-ND Carrot & Company GmbH

Today's Topics

  • Routing Modules
  • Multiple Router Outlets
  • Optional Route Parameter
  • Query Parameters and Fragments
  • Asynchronous Routing
  • Preloading
slide-8
SLIDE 8

CC BY-NC-ND Carrot & Company GmbH

Sample Application

  • https://gitlab.fwda.cnc.io/fwda/router
slide-9
SLIDE 9

CC BY-NC-ND Carrot & Company GmbH

Routes Configuration

Wildcard Route Redirecting Route Route with Parameter Route Data Child Routes

  • first-match wins strategy
  • Route data:

○ page titles, breadcrumb text, and other read-only, static data

slide-10
SLIDE 10

CC BY-NC-ND Carrot & Company GmbH

Routes Configuration

Routes Config Print navigation lifecycle to console

RouterModule.forRoot method is a pattern used to register application-wide providers

slide-11
SLIDE 11

CC BY-NC-ND Carrot & Company GmbH

Router Link & Router Outlet

<a routerLink="/user/bob">link to user component</a> <a [routerLink]="[‘/user’, ‘bob’]">link to user component</a>

  • Router Outlet acts as a placeholder
slide-12
SLIDE 12

CC BY-NC-ND Carrot & Company GmbH

ActivatedRoute

import { ActivatedRoute } from '@angular/router'; ... constructor(private activatedRoute: ActivatedRoute) { }

Important: convert param to number with ‘+’

Unsubscribe from this observable? The Router destroys a routed component when it is no longer needed and the injected ActivatedRoute dies with it.

slide-13
SLIDE 13

CC BY-NC-ND Carrot & Company GmbH

ActivatedRoute

  • Observable paramMap and component reuse

○ 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 ○ Eg: ■ A parent component navigation bar had "forward" and "back" buttons that scrolled through the list of persons. Each click navigated to the detail component of a person with the next or previous id. ○ Alternative: ■ Use a snapshot ■ let id = this.activatedRoute.snapshot.paramMap.get('id'); https://angular.io/guide/router#parammap-api

slide-14
SLIDE 14

CC BY-NC-ND Carrot & Company GmbH

Relative Navigation

Current route: localhost:5555/user/1/details <a [routerLink]=" ...">link to user component</a> [‘../’] localhost:5555/user/1 [‘../../’] localhost:5555/user [‘../admin’] localhost:5555/user/1/admin [‘./admin’] localhost:5555/user/1/details/admin [‘/admin’] localhost:5555/admin directory-like syntax:

slide-15
SLIDE 15

CC BY-NC-ND Carrot & Company GmbH

Relative Navigation

import { Router, ActivatedRoute } from '@angular/router'; ... constructor(private router: Router, private activatedRoute: ActivatedRoute){ } ...

slide-16
SLIDE 16

CC BY-NC-ND Carrot & Company GmbH

Router Events

https://angular.io/guide/router#router-events

slide-17
SLIDE 17

CC BY-NC-ND Carrot & Company GmbH

Route Guards

  • The user is not authorized to navigate to the target component
  • The user must login first
  • Fetch some data before you display the target component
  • Save pending changes before leaving a component
  • Ask the user if it's OK to discard pending changes rather than save them

CanActivate, CanActivateChild Resolve CanDeactivate

slide-18
SLIDE 18

CC BY-NC-ND Carrot & Company GmbH

Route Guards

  • Multiple guards at every level of a routing hierarchy
  • The router checks the CanDeactivate and CanActivateChild guards first, from

the deepest child route to the top

  • Then it checks the CanActivate guards from the top down to the deepest child

route

  • Return value of a guard controls the routing behavior

○ True ■ Navigation process continues ○ False ■ Navigation process stops and the user stays put ■ Pending guards that have not completed will be canceled, and the entire navigation is canceled

slide-19
SLIDE 19

CC BY-NC-ND Carrot & Company GmbH

Route Guards

slide-20
SLIDE 20

CC BY-NC-ND Carrot & Company GmbH

Route Guards

slide-21
SLIDE 21

CC BY-NC-ND Carrot & Company GmbH

Route Guards

CanDeactivate CanActivate

slide-22
SLIDE 22

CC BY-NC-ND Carrot & Company GmbH

Route Guards

CanActivateChild Resolve

slide-23
SLIDE 23

CC BY-NC-ND Carrot & Company GmbH

Route Guards

  • The guard can also cancel the navigation and tell router to navigate elsewhere
  • Requires an Observable to complete, meaning it has emitted all of its values

Note: The observable provided to the Router must also complete. If the

  • bservable does not complete, the navigation will not continue.

http://rxmarbles.com/#first

slide-24
SLIDE 24

CC BY-NC-ND Carrot & Company GmbH

Route Guards

  • Guards and the service providers they require must be provided at the

module-level

○ Router can retrieve these services from the injector during the navigation process ○ Same rule applies for feature modules loaded asynchronously @Injectable() export class PermissionGuard implements CanActivate { constructor(private personService: PersonService) { } … } @NgModule({ declarations: [...], imports: [...], providers: [ PersonService, ... ], bootstrap: [...] }) export class AppModule {}

slide-25
SLIDE 25

CC BY-NC-ND Carrot & Company GmbH

Component-less Route

  • Grouping routes
  • Makes it easier to guard child routes
slide-26
SLIDE 26

CC BY-NC-ND Carrot & Company GmbH

Routing Modules

  • 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!
slide-27
SLIDE 27

CC BY-NC-ND Carrot & Company GmbH

Routing Modules

Order!

By re-exporting the RouterModule here the components declared in AppModule will have access to router directives such as RouterLink and RouterOutlet.

slide-28
SLIDE 28

CC BY-NC-ND Carrot & Company GmbH

Routing Modules really necessary?

Advice from the Angular Team: Choose one pattern or the other and follow that pattern consistently.

slide-29
SLIDE 29

CC BY-NC-ND Carrot & Company GmbH

Multiple Router Outlets

  • The router only supports one primary unnamed outlet per template
  • 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

  • Named outlets are the targets of secondary routes
  • Eg: Pop-Up
slide-30
SLIDE 30

CC BY-NC-ND Carrot & Company GmbH

Multiple Router Outlets & Secondary Routes

Secondary routes look like primary routes and you can configure them the same way.

  • They are independent of each other
  • They work in combination with other routes

Route: http://localhost:4200/persons(popup:popup)

slide-31
SLIDE 31

CC BY-NC-ND Carrot & Company GmbH

Route Parameter

Required URL Parameter (as placeholder in the route) Optional URL Parameters (matrix URL notation) Query Parameters Fragment

slide-32
SLIDE 32

CC BY-NC-ND Carrot & Company GmbH

Optional Route Parameter

  • Optional route parameters are not separated by "?" or "&" as they would be in

the URL query string

  • Separated by semicolons ";"
  • Matrix URL notation

  • Eg. localhost:4200/persons;id=15;foo=bar
slide-33
SLIDE 33

CC BY-NC-ND Carrot & Company GmbH

Query Parameters and Fragments

More information about query parameter handling and preserving of query parameter and fragments: https://angular.io/api/router/NavigationExtras

  • Fragments refer to certain elements on the page identified with an id attribute

http://localhost:4200/permission-denied?errorCode=1234#permission

slide-34
SLIDE 34

CC BY-NC-ND Carrot & Company GmbH

Sample Application

  • https://gitlab.fwda.cnc.io/fwda/ng-modules
slide-35
SLIDE 35

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

  • At the moment:

○ AdminModule is loaded when the application starts ○ → Eager loading ■ Means that all modules are loaded when the app launches

  • What we want:

○ AdminModule loads only when the user clicks on a link ○ → Lazy loading

slide-36
SLIDE 36

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

  • Load feature modules lazily, on request
  • Multiple benefits

○ Load feature areas only when requested by the user ○ Speed up load time for users that only visit certain areas of the app

slide-37
SLIDE 37

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

  • Provided services in a lazy-loaded module are only visible to that module

○ Module-scoped

  • Router lazy-loads a module → it creates a new execution context
  • Context has its own injector

○ Child injector ○ Direct child of the root injector

  • Providers of a lazy module and the providers of its imported modules are

added to the child injector

slide-38
SLIDE 38

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

Root Injector AppModule Child Injector PersonModule Child Injector AdminModule

Router lazy-loads a module

slide-39
SLIDE 39

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

  • Guard lazy loaded modules with a CanLoad guard
  • CanLoad guard is checked before the module is loaded
slide-40
SLIDE 40

CC BY-NC-ND Carrot & Company GmbH

Lazy Loading with the Router

  • CanLoad guard use case:

○ You are already protecting the AdminModule with a CanActivate guard that prevents unauthorized users from accessing the admin feature area. It will redirect the user 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'd only load the AdminModule if the user is logged in. ○ → Use CanLoad guard

slide-41
SLIDE 41

CC BY-NC-ND Carrot & Company GmbH

Routing vs Routed Modules

  • Routed Modules

○ Domain feature modules whose top components are the targets of routes ○ Lazy-loaded modules ○ Don’t export anything because their components never appear in the template of another component ○ Should not be imported by any module ■ Would trigger an eager load

  • Routing Modules

○ Provides routing configuration for another module ○ Separates routing concerns from its companion module

https://angular.io/guide/module-types

slide-42
SLIDE 42

CC BY-NC-ND Carrot & Company GmbH

Preloading

  • After each successful navigation

○ Router looks in its configuration for an unloaded module that it can preload ○ Preloading depends on preloading strategy

  • Preloading strategies

○ None (Default) ○ Preload all Modules ○ Custom Preloading Strategy

Custom Preloading Strategy: https://angular.io/guide/router#custom-preloading-strategy https://vsavkin.com/angular-router-preloading-modules-ba3c75e424cb

slide-43
SLIDE 43

CC BY-NC-ND Carrot & Company GmbH

Preloading

  • PreloadAllModules strategy does not load feature areas protected by a

CanLoad guard

  • Want to preload a module and guard against unauthorized access, drop the

CanLoad guard and use the CanActivate guard alone

slide-44
SLIDE 44

CC BY-NC-ND Carrot & Company GmbH

Thank you for your attention!

Questions?

slide-45
SLIDE 45

Todos

  • Refactor code based on suggestions and code comments
  • Finish 3nd Sprint