Tah*_*her 8 typescript angular
当我构建CanDeactivateGuard时出现此错误。
未捕获(承诺中):TypeError:component.canDeactivate 不是函数
我想让我的CanDeactivateGuard可重复使用,所以它应该是通用的。
因此,我构建了一个名为ComponentCanDeactivate的抽象类,然后在TreeCanDeactivateGuard中扩展它。
然后CanDeactivateGuard应该实现CanDeactivate接口。
我的代码:
import { HostListener } from '@angular/core';
export abstract class ComponentCanDeactivate {
public abstract canDeactivate(): boolean;
@HostListener('window:beforeunload', ['$event'])
unloadNotification($event: any) {
if (!this.canDeactivate()) {
$event.returnValue = true;
}
}
Run Code Online (Sandbox Code Playgroud)
}
TreeCanDeactivateGuard :
import { ComponentCanDeactivate } from './canDeactivate/component-can-deactivate';
import { NodeService } from '../tree/node.service';
export abstract class TreeCanDeactivateGuard extends ComponentCanDeactivate {
constructor(private _nodeService: NodeService) {
super();
}
public canDeactivate(): boolean {
if (this._nodeService.treeChangesTracer === false) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
}
CanDeactivateGuard :
import { Injectable } from '@angular/core';
import { CanDeactivate } from '@angular/router';
import { ComponentCanDeactivate } from './component-can-deactivate';
@Injectable()
export class CanDeactivateGuard implements CanDeactivate<ComponentCanDeactivate> {
constructor() { }
canDeactivate(component: ComponentCanDeactivate): boolean {
if (!component.canDeactivate()) {
if (confirm('You have unsaved changes! If you leave, your changes will be lost.')) {
return true;
} else {
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
路线模块:
const routes: Routes = [
{
path: '', component: TreeComponent, canDeactivate: [CanDeactivateGuard] , runGuardsAndResolvers: 'always',
}]
Run Code Online (Sandbox Code Playgroud)
什么是TreeCanDeactivateGuard?您的代码中没有任何地方引用它。
你不想TreeCanDeactivateGuard延长ComponentCanDeactivate,而是想TreeComponent延长ComponentCanDeactivate。
让任何组件扩展ComponentCanDeactivate并实现canDeactivate,然后您就可以CanDeactivateGuard为其使用通用防护。
您还可以替换:
if (confirm('You have unsaved changes! If you leave, your changes will be lost.')) {
return true;
} else {
return false;
}
Run Code Online (Sandbox Code Playgroud)
和:return confirm('You have unsaved changes! If you leave, your changes will be lost.');
| 归档时间: |
|
| 查看次数: |
6512 次 |
| 最近记录: |