Skip to content

Instantly share code, notes, and snippets.

@nicobytes
Created August 22, 2021 20:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicobytes/b0dfe30ad5b1fbdf73b931586ade9b42 to your computer and use it in GitHub Desktop.
Save nicobytes/b0dfe30ad5b1fbdf73b931586ade9b42 to your computer and use it in GitHub Desktop.
guard-deactivate

1 Create Guard

ng g g guards/exit

2 Implement in Routes

const routes: Routes = [
  {
    path: 'register',
    canDeactivate: [ExitGuard],
    component: RegisterComponent
  },
]; 

3 Generic Guard

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ExitGuard implements CanDeactivate<unknown> {
  canDeactivate(
    component: unknown,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return confirm('Are you sure?');
  }

}

4 Interface

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

export interface OnExit {
  onExit: () => Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree
}

@Injectable({
  providedIn: 'root'
})
export class ExitGuard implements CanDeactivate<unknown> {
  canDeactivate(
    component: OnExit,
    currentRoute: ActivatedRouteSnapshot,
    currentState: RouterStateSnapshot,
    nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return component.onExit ? component.onExit() : true;
  }

}

5 Implement

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';

import { OnExit } from './../../guards/exit.guard';

@Component({
  selector: 'app-register',
  templateUrl: './register.component.html',
  styleUrls: ['./register.component.css']
})
export class RegisterComponent implements OnInit, OnExit {

  form: FormGroup;

  constructor(
    private formBuilder: FormBuilder
  ) {
    this.form = this.formBuilder.group({
      email: [],
      password: [],
      confirmPassword: []
    })
  }

  ngOnInit(): void {
  }

  onExit() {
    if (this.form.dirty) {
      const rta = confirm('Are you sure?');
      return rta;
    }
    return true;
  }

}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment