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

时间:2016-01-12 19:33:14

标签: angular architecture abstraction

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

应该看起来更像或更少:

export abstract class AbstractComponent implements OnInit {

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

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

  ...
}

3 个答案:

答案 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>。 听起来不太干净,但至少对我有用。 如果有人碰巧找到更好的解决方案,请分享:)