Skip to content

Commit

Permalink
docs(router): Update router docs to use guard functions instead of @I…
Browse files Browse the repository at this point in the history
…njectable (#47989)

This commit updates various router docs to use the functional style
guards instead of the `@Injectable` style.

PR Close #47989
  • Loading branch information
atscott authored and AndrewKushnir committed Nov 8, 2022
1 parent a93a1a5 commit 2efcc26
Show file tree
Hide file tree
Showing 26 changed files with 242 additions and 362 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';

// #docregion admin-route
import {AuthGuard} from '../auth/auth.guard';
import {authGuard} from '../auth/auth.guard';

import {AdminDashboardComponent} from './admin-dashboard/admin-dashboard.component';
import {AdminComponent} from './admin/admin.component';
Expand All @@ -14,11 +14,11 @@ import {ManageHeroesComponent} from './manage-heroes/manage-heroes.component';
const adminRoutes: Routes = [{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard],
canActivate: [authGuard],

// #enddocregion admin-route
// #docregion can-match
canMatch: [AuthGuard],
canMatch: [authGuard],
// #enddocregion can-match
// #docregion admin-route
children: [{
Expand All @@ -29,7 +29,7 @@ const adminRoutes: Routes = [{
{path: '', component: AdminDashboardComponent}
],
// #enddocregion admin-route
canActivateChild: [AuthGuard]
canActivateChild: [authGuard]
// #docregion admin-route
}]
}];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ import { AdminDashboardComponent } from './admin-dashboard/admin-dashboard.compo
import { ManageCrisesComponent } from './manage-crises/manage-crises.component';
import { ManageHeroesComponent } from './manage-heroes/manage-heroes.component';

import { AuthGuard } from '../auth/auth.guard';
import { authGuard } from '../auth/auth.guard';

// #docregion can-activate-child
const adminRoutes: Routes = [
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard],
canActivate: [authGuard],
children: [
{
path: '',
canActivateChild: [AuthGuard],
canActivateChild: [authGuard],
children: [
{ path: 'crises', component: ManageCrisesComponent },
{ path: 'heroes', component: ManageHeroesComponent },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ import { AdminDashboardComponent } from './admin-dashboard/admin-dashboard.compo
import { ManageCrisesComponent } from './manage-crises/manage-crises.component';
import { ManageHeroesComponent } from './manage-heroes/manage-heroes.component';

import { AuthGuard } from '../auth/auth.guard';
import { authGuard } from '../auth/auth.guard';

const adminRoutes: Routes = [
{
path: '',
component: AdminComponent,
canActivate: [AuthGuard],
canActivate: [authGuard],
children: [
{
path: '',
canActivateChild: [AuthGuard],
canActivateChild: [authGuard],
children: [
{ path: 'crises', component: ManageCrisesComponent },
{ path: 'heroes', component: ManageHeroesComponent },
Expand Down
11 changes: 3 additions & 8 deletions aio/content/examples/router/src/app/app-routing.module.10.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import {Injectable, NgModule} from '@angular/core';
import {Title} from '@angular/platform-browser';
import {
Resolve,
ResolveFn,
RouterModule,
RouterStateSnapshot,
Routes,
Expand All @@ -18,7 +18,7 @@ const routes: Routes = [
children: [
{
path: 'child-a', // child route path
title: ResolvedChildATitle,
title: resolvedChildATitle,
component: ChildAComponent, // child route component that the router renders
},
{
Expand All @@ -30,12 +30,7 @@ const routes: Routes = [
},
];

@Injectable({providedIn: 'root'})
export class ResolvedChildATitle implements Resolve<string> {
resolve() {
return Promise.resolve('child a');
}
}
const resolvedChildATitle: ResolveFn<string> = () => Promise.resolve('child a');
// #enddocregion page-title


Expand Down
4 changes: 2 additions & 2 deletions aio/content/examples/router/src/app/app-routing.module.5.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { RouterModule, Routes } from '@angular/router';
import { ComposeMessageComponent } from './compose-message/compose-message.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';

import { AuthGuard } from './auth/auth.guard';
import { authGuard } from './auth/auth.guard';


const appRoutes: Routes = [
Expand All @@ -20,7 +20,7 @@ const appRoutes: Routes = [
path: 'admin',
loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
// #enddocregion admin-1
canLoad: [AuthGuard]
canLoad: [authGuard]
// #docregion admin-1
},
// #enddocregion admin, admin-1
Expand Down
4 changes: 2 additions & 2 deletions aio/content/examples/router/src/app/app-routing.module.6.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
import { ComposeMessageComponent } from './compose-message/compose-message.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';

import { AuthGuard } from './auth/auth.guard';
import { authGuard } from './auth/auth.guard';

const appRoutes: Routes = [
{
Expand All @@ -22,7 +22,7 @@ const appRoutes: Routes = [
{
path: 'admin',
loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
canLoad: [AuthGuard]
canLoad: [authGuard]
},
{
path: 'crisis-center',
Expand Down
4 changes: 2 additions & 2 deletions aio/content/examples/router/src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { RouterModule, Routes } from '@angular/router';
import { ComposeMessageComponent } from './compose-message/compose-message.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';

import { AuthGuard } from './auth/auth.guard';
import { authGuard } from './auth/auth.guard';
import { SelectivePreloadingStrategyService } from './selective-preloading-strategy.service';

const appRoutes: Routes = [
Expand All @@ -18,7 +18,7 @@ const appRoutes: Routes = [
{
path: 'admin',
loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),
canLoad: [AuthGuard]
canLoad: [authGuard]
},
// #docregion preload-v2
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// #docregion
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { AuthGuard } from './auth.guard';
import { authGuard } from './auth.guard';
import { AuthService } from './auth.service';
import { LoginComponent } from './login/login.component';

Expand Down
19 changes: 6 additions & 13 deletions aio/content/examples/router/src/app/auth/auth.guard.1.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
// #docregion
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { CanActivateFn } from '@angular/router';

@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate {
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
console.log('AuthGuard#canActivate called');
return true;
}
}
export const authGuard: CanActivateFn = () => {
console.log('authGuard#canActivate called');
return true;
};
// #enddocregion
48 changes: 14 additions & 34 deletions aio/content/examples/router/src/app/auth/auth.guard.2.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,25 @@
// #docregion
import {Injectable} from '@angular/core';
import {inject} from '@angular/core';
import {
ActivatedRouteSnapshot, CanActivate, CanMatch,
Route, Router, RouterStateSnapshot, UrlTree
CanActivateFn, CanMatchFn,
Router, UrlTree
} from '@angular/router';

import {AuthService} from './auth.service';

@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate, CanMatch {
constructor(private authService: AuthService, private router: Router) {}
export const authGuard: CanMatchFn|CanActivateFn = () => {
const authService = inject(AuthService);
const router = inject(Router);

canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): true|UrlTree {
const url: string = state.url;

return this.checkLogin(url);
}

// #enddocregion
// #docregion can-match
canMatch(route: Route) {
const url = `/${route.path}`;
return this.checkLogin(url) === true;
if (authService.isLoggedIn) {
return true;
}
// #enddocregion can-match
// #docregion

checkLogin(url: string): true|UrlTree {
if (this.authService.isLoggedIn) {
return true;
}
const url = router.getCurrentNavigation()!.extractedUrl.toString();
// Store the attempted URL for redirecting
authService.redirectUrl = url;
// Redirect to the login page
return router.parseUrl('/login');
};

// Store the attempted URL for redirecting
this.authService.redirectUrl = url;

// Redirect to the login page
return this.router.parseUrl('/login');
}
}
// #enddocregion
49 changes: 14 additions & 35 deletions aio/content/examples/router/src/app/auth/auth.guard.3.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,23 @@
// #docregion can-activate-child
import { Injectable } from '@angular/core';
import { inject } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot,
CanActivateChild,
CanActivateFn, CanMatchFn, Router,
CanActivateChildFn,
UrlTree
} from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthService, private router: Router) {}
export const authGuard: CanMatchFn|CanActivateFn|CanActivateChildFn = () => {
const authService = inject(AuthService);
const router = inject(Router);

canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): true|UrlTree {
const url: string = state.url;

return this.checkLogin(url);
}

canActivateChild(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): true|UrlTree {
return this.canActivate(route, state);
if (authService.isLoggedIn) {
return true;
}

// #enddocregion can-activate-child
checkLogin(url: string): true|UrlTree {
if (this.authService.isLoggedIn) { return true; }

// Store the attempted URL for redirecting
this.authService.redirectUrl = url;

// Redirect to the login page
return this.router.parseUrl('/login');
}
// #docregion can-activate-child
}
// #enddocregion
const url = router.getCurrentNavigation()!.extractedUrl.toString();
// Store the attempted URL for redirecting
authService.redirectUrl = url;
// Redirect to the login page
return router.parseUrl('/login');
};
55 changes: 22 additions & 33 deletions aio/content/examples/router/src/app/auth/auth.guard.4.ts
Original file line number Diff line number Diff line change
@@ -1,49 +1,38 @@
// #docplaster
// #docregion
import { Injectable } from '@angular/core';
import { inject } from '@angular/core';
import {
CanActivate, Router,
ActivatedRouteSnapshot,
RouterStateSnapshot,
CanActivateChild,
CanActivateFn, CanMatchFn, Router,
CanActivateChildFn,
NavigationExtras,
UrlTree
} from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({
providedIn: 'root',
})
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private authService: AuthService, private router: Router) {}
export const authGuard: CanMatchFn|CanActivateFn|CanActivateChildFn = () => {
const authService = inject(AuthService);
const router = inject(Router);

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): true|UrlTree {
const url: string = state.url;

return this.checkLogin(url);
if (authService.isLoggedIn) {
return true;
}

canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): true|UrlTree {
return this.canActivate(route, state);
}
const url = router.getCurrentNavigation()!.extractedUrl.toString();

checkLogin(url: string): true|UrlTree {
if (this.authService.isLoggedIn) { return true; }
// Store the attempted URL for redirecting
authService.redirectUrl = url;

// Store the attempted URL for redirecting
this.authService.redirectUrl = url;
// Create a dummy session id
const sessionId = 123456789;

// Create a dummy session id
const sessionId = 123456789;
// Set our navigation extras object
// that contains our global query params and fragment
const navigationExtras: NavigationExtras = {
queryParams: { session_id: sessionId },
fragment: 'anchor'
};

// Set our navigation extras object
// that contains our global query params and fragment
const navigationExtras: NavigationExtras = {
queryParams: { session_id: sessionId },
fragment: 'anchor'
};
// Redirect to the login page with extras
return router.createUrlTree(['/login'], navigationExtras);
};

// Redirect to the login page with extras
return this.router.createUrlTree(['/login'], navigationExtras);
}
}

0 comments on commit 2efcc26

Please sign in to comment.