gpt4 book ai didi

angular - 如何编写保护程序以防止用户在 Angular 6 中丢失表单数据?

转载 作者:太空狗 更新时间:2023-10-29 17:58:05 24 4
gpt4 key购买 nike

我希望在我的 Angular 6 应用程序中创建一个守卫,通过要求他们确认,防止用户从部分填写的表单中离开站点内的表单(而不是通过关闭浏览器或刷新)第一的。

我如何建立我的守卫,以便我可以将它应用到我的路线上,并防止用户意外地离开脏表单?

我正在尝试将表单注入(inject)守卫组件,观察它是否脏了,如果脏了,将该守卫应用到任何其他路由并让用户在导航到它们之前进行确认。这是我所能得到的最接近的结果,我们将不胜感激任何帮助。

这是我目前所拥有的:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanDeactivate } from '@angular/router';
import { Observable } from 'rxjs';
import { NgForm } from "@angular/forms";
import { createMPForm } from "../components/site-settings/site-settings.component"

@Injectable({
providedIn: 'root'
})

@Injectable()
export abstract class FormGuard implements CanActivate {
abstract get form(): NgForm;
formDirty(): boolean {
return createMPForm.dirty
}

constructor() { }

canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if (this.formDirty()) {
if (confirm("You have unsaved changes! If you leave, your changes will be lost.")) {
return true;}
else {
return false;}
}
}
}

在我的表单组件中我有这个,这样表单对象就可以被守卫导入:

export class createMPForm {
@ViewChild("createMPForm", {read: ElementRef}) form: ElementRef;
}

我的路线看起来像这样:

import { FormGuard } from './services/form-guard.service';
import { SiteSettingsComponent } from './components/site-settings/site-settings.component';
import { SiteComponent } from './components/site/site.component';
import { AuthGuard } from './services/auth-guard.service';

const routes: Routes = [
{ path: 'sites', component: SitesComponent, canActivate: [AuthGuard] }, //the route I want to keep from navigating to if the form is dirty
{ path: 'site-settings/:siteHid', component: SiteSettingsComponent, canActivate: [AuthGuard] }// the route with the form
];

@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
providers: [AuthGuard, FormGuard]
})

最佳答案

您正在寻找的是 CanDeactivate 守卫。这是一个守卫,在离开路线之前将被调用,并提供当前路线已呈现的组件。

你可以这样实现:

interface FormComponent {
hasUnsavedChanges: boolean
}

class FormGuard implements CanDeactivate<FormComponent> {
canDeactivate(component: FormComponent) {
return component.hasUnsavedChanges === false
}
}

引用: https://angular.io/api/router/CanDeactivate

关于angular - 如何编写保护程序以防止用户在 Angular 6 中丢失表单数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56228695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com