未捕获(承诺中):TypeError:component.canDeactivate 不是函数

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)

Twi*_*her 2

什么是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.');