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'}
]