Add a confirm massage whenever we going to Homepage from Edit page without saving something.
–can-deactivate-guard.service.ts
import { Observable } from "rxjs/Observable"; import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot } from "@angular/router"; export interface CanComponentDeactivate { canDeactivate: () => Observable | Promise | boolean; } export class CanDeactivateGuard implements CanDeactivate { canDeactivate(component: CanComponentDeactivate, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Observable | Promise | boolean { return component.canDeactivate(); } }
–edit-server.component.ts
import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Params, Router } from "@angular/router"; import { Observable } from "rxjs/Observable"; import { ServersService } from '../servers.service'; import { CanComponentDeactivate } from "./can-deactivate-guard.service"; @Component({ selector: 'app-edit-server', templateUrl: './edit-server.component.html', styleUrls: ['./edit-server.component.css'] }) export class EditServerComponent implements OnInit, CanComponentDeactivate { server: {id: number, name: string, status: string}; serverName = ''; serverStatus = ''; allowEdit = false; changeSaved = false; constructor(private serversService: ServersService, private route: ActivatedRoute, private router: Router) { } ngOnInit() { console.log(this.route.snapshot.queryParams); console.log(this.route.snapshot.fragment); this.route.queryParams .subscribe( (queryParams: Params) => { this.allowEdit = queryParams['allowEdit'] === '1' ? true : false; } ); this.route.fragment.subscribe(); const id = +this.route.snapshot.params['id']; this.server = this.serversService.getServer(id); // Subscribe route params to update the id if params change this.serverName = this.server.name; this.serverStatus = this.server.status; } onUpdateServer() { this.serversService.updateServer(this.server.id, {name: this.serverName, status: this.serverStatus}); this.changeSaved = true; this.router.navigate(['../'], {relativeTo: this.route}) } canDeactivate(): Observable | Promise | boolean{ if(!this.allowEdit) { return true; } if(this.serverName !== this.server.name || this.serverStatus !== this.server.status && this.changeSaved){ return confirm('Do you want to discard the changes?'); } else { return true; } } }
–app.routing.module.ts
const appRoutes: Routes = [ { path: '', redirectTo:'/home', pathMatch:'full'}, { path: 'home', component: HomeComponent}, { path: 'users', component: UsersComponent, children: [ { path: ':id/:name', component: UserComponent}, ]}, { path: 'servers', canActivateChild:[AuthGuard], component: ServersComponent, children: [ { path: ':id', component: ServerComponent}, { path: ':id/edit', component: EditServerComponent, canDeactivate: [CanDeactivateGuard]}, ]}, { path: 'error-404', component: Page404Component}, { path: '**', redirectTo: '/error-404'} ]