Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

CanDeactivate Guard in Angular

The CanDeactivate guard in Angular is used to prevent users from leaving a route if there are unsaved changes. This tutorial covers the basics of setting up and using the CanDeactivate guard effectively in your Angular applications.

Setting Up CanDeactivate Guard

To set up the CanDeactivate guard, you need to create a guard service and implement the CanDeactivate interface:

// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouterModule, Routes } from '@angular/router';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { EditComponent } from './edit/edit.component';
import { UnsavedChangesGuard } from './unsaved-changes.guard';

const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'edit', component: EditComponent, canDeactivate: [UnsavedChangesGuard] }
];

@NgModule({
  declarations: [AppComponent, HomeComponent, EditComponent],
  imports: [BrowserModule, RouterModule.forRoot(routes)],
  providers: [UnsavedChangesGuard],
  bootstrap: [AppComponent]
})
export class AppModule { }

// unsaved-changes.guard.ts
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { EditComponent } from './edit/edit.component';

@Injectable({
  providedIn: 'root'
})
export class UnsavedChangesGuard implements CanDeactivate {
  canDeactivate(component: EditComponent): boolean {
    if (component.hasUnsavedChanges()) {
      return confirm('You have unsaved changes. Do you really want to leave?');
    }
    return true;
  }
}

// home.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-home',
  template: '

Home Component

', }) export class HomeComponent { } // edit.component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-edit', template: `

Edit Component

`, }) export class EditComponent { unsavedChanges = true; hasUnsavedChanges(): boolean { return this.unsavedChanges; } saveChanges() { this.unsavedChanges = false; // Save changes logic here } } // app.component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { } // app.component.html

Creating a Guard Service

Create a guard service using the Angular CLI command ng generate guard unsaved-changes and implement the CanDeactivate interface:

// unsaved-changes.guard.ts
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { EditComponent } from './edit/edit.component';

@Injectable({
  providedIn: 'root'
})
export class UnsavedChangesGuard implements CanDeactivate {
  canDeactivate(component: EditComponent): boolean {
    if (component.hasUnsavedChanges()) {
      return confirm('You have unsaved changes. Do you really want to leave?');
    }
    return true;
  }
}

Using the CanDeactivate Guard

Use the canDeactivate property in your route configuration to protect the routes:

// app.module.ts
const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'edit', component: EditComponent, canDeactivate: [UnsavedChangesGuard] }
];

Key Points

  • The CanDeactivate guard is used to prevent users from leaving a route if there are unsaved changes.
  • Create a guard service and implement the CanDeactivate interface.
  • Use the canDeactivate property in your route configuration to protect the routes.
  • Implement the hasUnsavedChanges method in your component to check for unsaved changes.

Conclusion

The CanDeactivate guard in Angular provides a powerful way to prevent users from leaving a route if there are unsaved changes. By understanding and using the CanDeactivate guard effectively, you can create secure and user-friendly applications with protected routes. Happy coding!