2 回答

TA貢獻1810條經(jīng)驗 獲得超4個贊
canDeactivate您可以為每個組件使用guard,
首先你必須添加這個服務文件“deactivate-guard.service.ts”:
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { Observable } from 'rxjs/Observable';
export interface CanComponentDeactivate {
canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}
@Injectable()
export class DeactivateGuardService implements CanDeactivate<CanComponentDeactivate>{
canDeactivate(component: CanComponentDeactivate) {
return component.canDeactivate ? component.canDeactivate() : true;
}
}
那么你必須在應用程序模塊中提供:
providers: [
DeactivateGuardService
]
現(xiàn)在在您要保護的組件中,添加功能:
export class ExampleComponent {
loading: boolean = false;
@ViewChild('exampleForm') exampleForm: NgForm;
canDeactivate(): Observable<boolean> | boolean {
if (this.loading|| this.exampleForm.dirty) {
return this.confirmBox('Discard Unsaved Changes?');
}
return true;
}
confirmBox(message?: string): Observable<boolean> {
const confirmation = window.confirm(message || 'Are you sure?');
return of(confirmation);
};
}
將指令添加到路由模塊中的組件:
@NgModule({
imports: [
RouterModule.forRoot([
{
path: 'example',
canDeactivate: [DeactivateGuardService],
component: ExampleComponent
}
])
]

TA貢獻1779條經(jīng)驗 獲得超6個贊
您可以使用 canDeactivate 守衛(wèi)檢查頁面離開并顯示您希望顯示類似內(nèi)容的警告消息
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { Observable } from 'rxjs/Observable';
export interface CanComponentDeactivate {
canDeactivate: () => Observable<boolean> | Promise<boolean> | boolean;
}
@Injectable()
export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate>{
canDeactivate(component: CanComponentDeactivate) {
return component.canDeactivate ? component.canDeactivate() : true;
}
}
包括設置可以激活守衛(wèi)到這樣的路線
{ path: 'sample-path', component: SampleComponent, canDeactivate: [CanDeactivateGuard] },
和組件的 canDeactivate 方法
canDeactivate() {
if (this.formIsIncomplete > 0) {
let result: boolean = window.confirm("You have unsaved Changes");
return result;
}
return true;
}
添加回答
舉報