必要に応じて子でオーバーライドできるようにしながら、初期動作でAbstractComponentを作成したいのですが、可能ですか?それは良い習慣ですか?
多かれ少なかれそのように見えるはずです:
export abstract class AbstractComponent implements OnInit {
constructor(authService: AuthService, router: Router) {}
ngOnInit() {
if (authService.userNotLoggedInAnymore()) {
router.navigate(['Login']);
}
}
...
}
はい、そのクラスを実際の_@Component
_で拡張し、ngOnInitなどのオーバーライドするメソッドでsuper()
を呼び出すだけです。また、親に少なくとも同じかそれ以上の依存関係があるコンストラクターをオーバーライドし、それらをsuper()
で渡す必要もあります。
別の方法として、抽象クラスでコンストラクターパラメーターなしを実行し、@ 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']);
}
}
...
}
これは少し遅れるかもしれませんが、私は取得している人のための回避策を見つけました
ERROR in Cannot determine the module for class [MyComponent] in [file]!
Add [MyComponent] to the NgModule to fix it.
aOTで構築する場合。コンポーネントをdeclaration
セクションに追加するときは、<any>
でキャストしてみてください。 <any>MyComponent
。これはそれほどきれいに聞こえませんが、少なくとも私にとってはうまくいきます。誰かがたまたまより良い解決策を見つけたら、親切に共有してください:)