web-dev-qa-db-ja.com

Angular 2でコンポーネントの抽象化を作成することは可能ですか?

必要に応じて子でオーバーライドできるようにしながら、初期動作でAbstractComponentを作成したいのですが、可能ですか?それは良い習慣ですか?

多かれ少なかれそのように見えるはずです:

export abstract class AbstractComponent implements OnInit {

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

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

  ...
}
13

はい、そのクラスを実際の_@Component_で拡張し、ngOnInitなどのオーバーライドするメソッドでsuper()を呼び出すだけです。また、親に少なくとも同じかそれ以上の依存関係があるコンストラクターをオーバーライドし、それらをsuper()で渡す必要もあります。

13
Langley

別の方法として、抽象クラスでコンストラクターパラメーターなしを実行し、@ 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']);
    }
  }
  ...
}
1
Mike

これは少し遅れるかもしれませんが、私は取得している人のための回避策を見つけました

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

aOTで構築する場合。コンポーネントをdeclarationセクションに追加するときは、<any>でキャストしてみてください。 <any>MyComponent。これはそれほどきれいに聞こえませんが、少なくとも私にとってはうまくいきます。誰かがたまたまより良い解決策を見つけたら、親切に共有してください:)

0
Kiang