• 检查用户是否可以退出路由。比如用户在表单中输入的内容没有保存,用户又要离开路由,此时可以调用该守卫提示用户 ```typescript import { Injectable } from ‘@angular/core’; import { ActivatedRouteSnapshot, CanDeactivate, RouterStateSnapshot, UrlTree } from ‘@angular/router’; import { Observable } from ‘rxjs’;

    // 定义一个接口,canLeave 可以没有参数,但是一定要有一个返回值 export interface CanLeave { canLeave: () => boolean }

    @Injectable({ providedIn: ‘root’ })

    // 换成了 export class AnsaveGuard implements CanDeactivate { canDeactivate( component: CanLeave, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { if (component.canLeave()) { return true } return false } }

    1. ```typescript
    2. // home.component.ts
    3. import { Component, OnInit } from '@angular/core';
    4. import { FormControl, FormGroup } from '@angular/forms';
    5. import { CanLeave } from 'src/app/guards/ansave.guard';
    6. @Component({
    7. selector: 'app-home',
    8. templateUrl: './home.component.html',
    9. styleUrls: ['./home.component.scss']
    10. })
    11. export class HomeComponent implements OnInit, CanLeave {
    12. myForm: FormGroup = new FormGroup({
    13. username: new FormControl()
    14. })
    15. // canLeave 是 ansave.guard.ts 中定义的方法
    16. canLeave(): boolean {
    17. // dirty 是 true 表示用户修改这个表单
    18. if (this.myForm.dirty) {
    19. if (window.confirm("有数据未保存, 确定要离开吗")) {
    20. return true
    21. } else {
    22. return false
    23. }
    24. }
    25. return true
    26. }
    27. constructor() { }
    28. ngOnInit(): void { }
    29. }
    1. // home.component.html
    2. <form [formGroup]="myForm">
    3. <input type="text" formControlName="username">
    4. </form>
    1. // app-routing.module.ts
    2. {
    3. path: "home",
    4. component: HomeComponent,
    5. canDeactivate: [AnsaveGuard]
    6. },