Bird
Raised Fist0
Angularframework~10 mins

Route guards (canActivate, canDeactivate) in Angular - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Route guards (canActivate, canDeactivate)
User tries to navigate to a route
↓
canActivate guard runs?
No→Navigation blocked
Yes↓
Route component loads
↓
User tries to leave route
↓
canDeactivate guard runs?
No→Navigation blocked
Yes↓
Navigation allowed to next route
When navigating, Angular first checks canActivate to allow entry. When leaving, it checks canDeactivate to allow exit.
Execution Sample
Angular
canActivate(route, state) {
  return confirm('Enter this page?');
}

canDeactivate(component) {
  return confirm('Leave this page?');
}
Simple guards ask user confirmation before entering or leaving a route.
Execution Table
StepTriggerGuard TypeUser ResponseGuard ResultNavigation Outcome
1User clicks link to /dashboardcanActivateUser clicks OKtrueNavigation allowed, component loads
2User clicks link to /dashboardcanActivateUser clicks CancelfalseNavigation blocked, stays on current page
3User tries to leave /dashboardcanDeactivateUser clicks OKtrueNavigation allowed to next route
4User tries to leave /dashboardcanDeactivateUser clicks CancelfalseNavigation blocked, stays on /dashboard
💡 Navigation stops if guard returns false, otherwise continues.
Variable Tracker
VariableStartAfter Step 1After Step 3Final
canActivate resultundefinedtrue or false (based on user)N/Atrue or false
canDeactivate resultundefinedN/Atrue or false (based on user)true or false
Key Moments - 3 Insights
Why does navigation stop even if the user clicks Cancel on canActivate?
Because canActivate returned false (see execution_table row 2), Angular blocks navigation before loading the route.
What happens if canDeactivate returns false when leaving a route?
Navigation is blocked and the user stays on the current route (see execution_table row 4).
Does canDeactivate run before or after the component loads?
It runs when the user tries to leave the route, after the component has loaded (see concept_flow).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the navigation outcome if canActivate returns false?
ANavigation allowed, component loads
BNavigation blocked, stays on current page
CNavigation allowed but component does not load
DNavigation blocked but component loads
💡 Hint
Check execution_table row 2 under Navigation Outcome
At which step does canDeactivate guard run?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
See execution_table rows 3 and 4 for canDeactivate triggers
If user always clicks OK, what will be the final value of canActivate and canDeactivate results?
AcanActivate: true, canDeactivate: true
BcanActivate: true, canDeactivate: false
CcanActivate: false, canDeactivate: false
DcanActivate: false, canDeactivate: true
💡 Hint
Check variable_tracker values after user clicks OK in steps 1 and 3
Concept Snapshot
Route guards control navigation in Angular.
canActivate runs before entering a route.
canDeactivate runs before leaving a route.
Return true to allow navigation, false to block.
Commonly used for login checks and unsaved changes warnings.
Full Transcript
Route guards in Angular help control if a user can enter or leave a page. The canActivate guard runs when the user tries to go to a route. If it returns true, navigation continues and the page loads. If false, navigation stops. The canDeactivate guard runs when the user tries to leave a route. If it returns true, navigation continues to the next page. If false, the user stays on the current page. Guards often ask for user confirmation. This visual shows steps where guards run, user responses, and navigation results. It helps beginners see how guards block or allow navigation based on conditions.

Practice

(1/5)
1. What is the primary purpose of the canActivate guard in Angular routing?
easy
A. To handle errors during route navigation.
B. To check if navigation to a route is allowed before entering it.
C. To preload data before the route loads.
D. To confirm if navigation away from a route is allowed.

Solution

  1. Step 1: Understand the role of canActivate

    canActivate is a route guard that runs before entering a route to decide if navigation is allowed.
  2. Step 2: Differentiate from other guards

    canDeactivate checks leaving a route, not entering. Preloading and error handling are unrelated to canActivate.
  3. Final Answer:

    To check if navigation to a route is allowed before entering it. -> Option B
  4. Quick Check:

    canActivate = check before entering route [OK]
Hint: canActivate controls entering routes, canDeactivate controls leaving [OK]
Common Mistakes:
  • Confusing canActivate with canDeactivate
  • Thinking canActivate preloads data
  • Assuming canActivate handles errors
2. Which of the following is the correct syntax to apply a canDeactivate guard to a route in Angular?
easy
A. { path: 'edit', component: EditComponent, canDeactivate: [UnsavedChangesGuard] }
B. { path: 'edit', component: EditComponent, canLoad: [LoadGuard] }
C. { path: 'edit', component: EditComponent, canActivate: [AuthGuard] }
D. { path: 'edit', component: EditComponent, canActivateChild: [ChildGuard] }

Solution

  1. Step 1: Identify the guard type for leaving routes

    canDeactivate is used to check if navigation away from a route is allowed.
  2. Step 2: Match syntax with canDeactivate

    The correct syntax uses canDeactivate: [GuardName] inside the route object.
  3. Final Answer:

    { path: 'edit', component: EditComponent, canDeactivate: [UnsavedChangesGuard] } -> Option A
  4. Quick Check:

    canDeactivate syntax = canDeactivate: [Guard] [OK]
Hint: Use canDeactivate: [Guard] to protect leaving a route [OK]
Common Mistakes:
  • Using canActivate instead of canDeactivate for leaving routes
  • Confusing canLoad with canDeactivate
  • Missing brackets around guard name
3. Given this canDeactivate guard code snippet, what will happen when the user tries to leave the EditComponent with unsaved changes?
export class UnsavedChangesGuard implements CanDeactivate<EditComponent> {
  canDeactivate(component: EditComponent): boolean {
    if (component.hasUnsavedChanges()) {
      return confirm('You have unsaved changes. Leave anyway?');
    }
    return true;
  }
}
medium
A. The guard throws an error because confirm is not allowed.
B. The user is always allowed to leave without confirmation.
C. The user is blocked from leaving if there are unsaved changes.
D. The user is asked to confirm leaving only if there are unsaved changes.

Solution

  1. Step 1: Analyze the guard logic

    The guard checks if component.hasUnsavedChanges() returns true, then asks for confirmation.
  2. Step 2: Understand the confirm behavior

    If the user confirms, confirm() returns true allowing navigation; otherwise, navigation is blocked.
  3. Final Answer:

    The user is asked to confirm leaving only if there are unsaved changes. -> Option D
  4. Quick Check:

    canDeactivate confirms only if unsaved changes exist [OK]
Hint: canDeactivate can prompt user to confirm leaving [OK]
Common Mistakes:
  • Assuming user can leave without confirmation always
  • Thinking guard blocks leaving without prompt
  • Believing confirm causes errors in Angular guards
4. Identify the error in this canActivate guard implementation:
export class AuthGuard implements CanActivate {
  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    if (this.authService.isLoggedIn()) {
      return true;
    }
  }
}
medium
A. Missing return statement when user is not logged in.
B. Incorrect method name; should be canDeactivate.
C. The guard should return a Promise, not boolean.
D. The guard must not use services inside canActivate.

Solution

  1. Step 1: Check all code paths return a value

    If isLoggedIn() is false, the method returns nothing (undefined), which is invalid.
  2. Step 2: Understand guard return requirements

    canActivate must return true, false, or an observable/promise resolving to those. Missing return causes errors.
  3. Final Answer:

    Missing return statement when user is not logged in. -> Option A
  4. Quick Check:

    All canActivate paths must return true/false [OK]
Hint: Always return true or false in all canActivate paths [OK]
Common Mistakes:
  • Not returning false or redirect when unauthorized
  • Confusing canActivate with canDeactivate method names
  • Thinking services can't be used in guards
5. You want to prevent users from leaving a form page if they have unsaved changes, but only if they are editing (not creating new). Which approach correctly uses canDeactivate to achieve this?
hard
A. Use canActivate guard to check unsaved changes before entering the form route.
B. Use canDeactivate guard that always returns true to allow navigation.
C. Use canDeactivate guard that checks component.isEditing and component.hasUnsavedChanges() before confirming navigation.
D. Use canActivateChild guard to block leaving the form.

Solution

  1. Step 1: Identify when to block navigation away

    Blocking leaving only applies when editing and unsaved changes exist, so guard must check both conditions.
  2. Step 2: Use canDeactivate guard properly

    canDeactivate runs when leaving a route, so it is the correct place to check and confirm navigation.
  3. Final Answer:

    Use canDeactivate guard that checks component.isEditing and component.hasUnsavedChanges() before confirming navigation. -> Option C
  4. Quick Check:

    canDeactivate with condition on editing and unsaved changes [OK]
Hint: Check editing and unsaved changes inside canDeactivate guard [OK]
Common Mistakes:
  • Using canActivate to block leaving routes
  • Always returning true in canDeactivate guard
  • Confusing canActivateChild with canDeactivate
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard