2

私は奇妙な状況に遭遇し、それが正しいかどうか議論したい. (最後に小さな質問の更新も探してください)

angular 4.3には、いくつかの角度コンポーネントによって拡張された抽象クラスがあります。次のようになります。

export abstract class SidePanel {
  protected prop1;
  protected prop2;

  protected method1() {
    //...
  };
}

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
 // body
}

@Component({
 // ...
})
export class SidePanelTwo extends SidePanel {
 // body
}

親クラス SidePanel にいくつかの一般的な機能を追加したいのですが、それには angular の Injector にアクセスできる必要があります。だから私はこのようなことをしたい:

export abstract class SidePanel {
  protected prop1;
  protected prop2;

  constructor(injector: Injector){
    this.prop1 = injector.get(MyClassName);
  }

  protected method1() {
    //...
  };
}

これを可能にするために、子から Injector を渡すことができます。

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
 constructor(injector: Injector) {
   super(injector);
 }

 //rest of body
}

しかし、私には子供が多すぎるため、そうしたくありません。その場合、それらすべてにインジェクターを追加する必要がありました。だから私は簡単な解決策を見つけました(しかし、それが正しいかどうかはわかりません):

@Injectable()
export abstract class SidePanel {
  protected prop1;
  protected prop2;

  constructor(injector: Injector){
    this.prop1 = injector.get(MyClassName);
  }

  protected method1() {
    //...
  };
}

@Component({
 // ...
})
export class SidePanelOne extends SidePanel {
  private test() {
    this.prop1.myClassMethod(); // works!
  }

 // rest of body
}

その結果、子クラス (コンポーネント) は、Injector を注入して渡すためだけに独自のコンストラクターを持つ必要はなく、すべて正常に動作します。しかし、抽象クラスに Injectable() デコレータを適用するのは奇妙に見えます。

それは正しいですか?

ご意見をお寄せいただきありがとうございます。

更新 14.03:

判明したように、上記の状況では、Injectable の代わりに「空の」Component デコレータを使用できます。

@Component({})
export abstract class SidePanel {
  // body
}

メタデータが空のコンポーネントは何を意味するのか、それを使用するのは正しいのか、すべてのパラメーターがオプション (セレクターも含む) なのはなぜですか?

4

0 に答える 0