我想创建一个具有初始行为的AbstractComponent,同时能够在需要时覆盖它,可能吗?这是一个好习惯吗?
应该看起来更像或更少:
export abstract class AbstractComponent implements OnInit {
constructor(authService: AuthService, router: Router) {}
ngOnInit() {
if (authService.userNotLoggedInAnymore()) {
router.navigate(['Login']);
}
}
...
}
答案 0 :(得分:13)
是的,只需使用真实@Component
扩展该类,并在您覆盖的方法中调用super()
,例如ngOnInit。而且您还必须覆盖父项中至少具有相同或更多依赖项的构造函数,并将它们与super()
一起传递。
答案 1 :(得分:1)
或者,您也可以完全在抽象类中完全不用构造器参数,并使用 @Inject 装饰器声明服务,那么您不需要触摸继承类的构造函数并在那里调用super(...)方法:
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']);
}
}
...
}
答案 2 :(得分:0)
这可能会有点晚了,但是我发现了一个解决方案,
mainF
使用AOT构建时。
将组件添加到ERROR in Cannot determine the module for class [MyComponent] in [file]!
Add [MyComponent] to the NgModule to fix it.
部分时,请尝试使用declaration
进行投射,例如<any>
。
听起来不太干净,但至少对我有用。
如果有人碰巧找到更好的解决方案,请分享:)