具有修饰方法的组件的基础 class 未在从其继承的组件中选取

Base class for component with a decorated method is not being picked up in the component that inherits from it

我在我的组件中使用这段代码在用户刷新页面之前进行确认,以避免错误地丢失更改:

  @HostListener('window:beforeunload', ['$event'])
  unloadNotification($event: any) {
    if (!this.canDeactivate()) {
     $event.returnValue = '';
     $event.preventDefault();
    }
  }

为了避免在其他组件中重复该代码,我想创建一个基础 class,例如

@Injectable()
export abstract class ComponentCanDeactivate {
  abstract canDeactivate(): boolean;

  @HostListener('window:beforeunload', ['$event'])
  unloadNotification($event: any) {
    if (!this.canDeactivate()) {
      $event.returnValue = '';
      $event.preventDefault();
    }
  }

但现在扩展此基础的组件 class 似乎没有监听 beforeunload 事件。 Angular 没有选择装饰器是因为它在基础 class 上吗?我在下面看到这项工作:example 使用 angular 11,我正在使用 angular 13。不知道这是否改变了行为或者我是否遗漏了什么

您需要摘要 class 成为 Component 而不是 Injectable

@Component({ template: '' })
export abstract class ComponentCanDeactivate {

https://stackblitz.com/edit/angular-ivy-xsmfdn?file=src/app/concrete/concrete.component.ts

Angular 支持继承 HostListener 但当你像这样混合装饰器时似乎会感到困惑。