是否可以在 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
。
这听起来不太干净,但至少对我有用。
如果有人碰巧找到更好的解决方案,请分享:)
我想创建一个具有初始行为的 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
。
这听起来不太干净,但至少对我有用。
如果有人碰巧找到更好的解决方案,请分享:)