是否可以在 Angular 2 上创建组件抽象?

Is it possible to create a Component abstraction on Angular 2?

我想创建一个具有初始行为的 AbstractComponent,同时能够在需要时在子组件上覆盖它,这可能吗?这是一个好习惯吗?

应该差不多像这样:

export abstract class AbstractComponent implements OnInit {

  constructor(authService: AuthService, router: Router) {}

  ngOnInit() {
    if (authService.userNotLoggedInAnymore()) {
      router.navigate(['Login']);
    }
  }

  ...
}

是的,只需用真正的 @Component 扩展 class 并在您覆盖的方法中调用 super(),例如 ngOnInit。而且您还必须覆盖父级中至少具有相同或更多依赖项的构造函数,并使用 super() 传递它们。

作为替代方案,您也可以 在抽象 class 中完全不使用构造函数参数 并使用 @Inject[ 声明服务=15=] 装饰器,那么你不需要触及继承 class 的构造函数并在那里调用超级(...)方法:

import { Inject } from '@angular/core';

export abstract class AbstractComponent implements OnInit {

  @Inject(AuthService) private authService: AuthService;
  @Inject(Router) private router: Router;

  ngOnInit() {
    if (authService.userNotLoggedInAnymore()) {
      router.navigate(['Login']);
    }
  }
  ...
}

这可能有点晚了,但我找到了一个解决方法,适用于正在获取

的人
ERROR in Cannot determine the module for class [MyComponent] in [file]!
Add [MyComponent] to the NgModule to fix it.

使用 AOT 构建时。 将组件添加到 declaration 部分时,尝试使用 <any> 进行转换,例如<any>MyComponent。 这听起来不太干净,但至少对我有用。 如果有人碰巧找到更好的解决方案,请分享:)