Angular 在 canDeactivate Guard 服务中使用模式对话框来处理未提交的更改(表单脏)

作者:编程家 分类: angular 时间:2025-07-31

Angular 中使用 canDeactivate Guard 服务处理未提交的更改

在Angular应用程序中,当用户正在编辑表单或页面上的内容时,经常会遇到需要在用户尝试导航离开时检查是否有未提交的更改的情况。为了确保用户不会意外丢失已做的更改,可以使用 `canDeactivate` 守卫来创建一个询问模式对话框,提示用户保存更改或取消导航操作。本文将介绍如何使用 `canDeactivate` 守卫服务以及模态对话框来处理未提交的更改。

### 创建 CanDeactivate Guard

首先,让我们创建一个名为 `CanDeactivateGuard` 的 `CanDeactivate` 守卫服务。这个守卫将会拦截导航并检查是否有未保存的更改。如果有未保存的更改,它将弹出一个模态对话框以确认用户意图。

typescript

import { Injectable } from '@angular/core';

import { CanDeactivate } from '@angular/router';

import { Observable } from 'rxjs';

import { MatDialog } from '@angular/material/dialog';

import { YourComponent } from './your-component-path';

@Injectable({

providedIn: 'root'

})

export class CanDeactivateGuard implements CanDeactivate {

constructor(private dialog: MatDialog) {}

canDeactivate(component: YourComponent): Observable | boolean {

if (component.isDirty()) { // Assuming 'isDirty()' method checks if there are unsaved changes

const dialogRef = this.dialog.open(ConfirmationDialogComponent, {

width: '400px',

data: { message: '您有未保存的更改。您确定要离开吗?' }

});

return dialogRef.afterClosed();

}

return true;

}

}

### 使用模态对话框确认未保存的更改

在上面的示例中,`CanDeactivateGuard` 会检查与 `YourComponent` 相关的 `isDirty()` 方法以判断是否有未保存的更改。如果有,它将打开一个名为 `ConfirmationDialogComponent` 的确认对话框以供用户选择。

typescript

import { Component, Inject } from '@angular/core';

import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';

@Component({

selector: 'app-confirmation-dialog',

template: `

确认

{{ data.message }}

`,

})

export class ConfirmationDialogComponent {

constructor(

public dialogRef: MatDialogRef,

@Inject(MAT_DIALOG_DATA) public data: { message: string }

) {}

}

### 在路由中应用 CanDeactivate Guard

最后,将 `CanDeactivateGuard` 应用到需要进行更改检查的路由中。

typescript

import { NgModule } from '@angular/core';

import { RouterModule, Routes } from '@angular/router';

import { YourComponent } from './your-component-path';

import { CanDeactivateGuard } from './can-deactivate.guard';

const routes: Routes = [

{

path: 'your-component',

component: YourComponent,

canDeactivate: [CanDeactivateGuard]

},

// ... other routes

];

@NgModule({

imports: [RouterModule.forRoot(routes)],

exports: [RouterModule]

})

export class AppRoutingModule {}

通过以上步骤,您可以轻松地使用 `canDeactivate` 守卫和模态对话框来处理用户在Angular应用程序中进行的未提交更改,以确保用户在离开页面之前得到确认或保存更改。