2017-01-17 3 views
2

私は単にここThingServiceと同じように、そのコンストラクタに引数に注釈を付け、Angular2コンポーネントに依存を注入することを理解しています。私が理解したいのは、実行時にAngularが何を注入するかを知っていることです。私が知る限り、これは単なるTypeScript注釈であり、実行時に意味を持ちません。コンポーネントのコンストラクタのどこに配置されているかを管理するための低レベルの内部メカニズムは何ですか?あなたがこのシステムを自分でロールするなら、どうすればうまくいくのですか?これは私が理解していないタイスクリプト機構ですか?Angular2は依存性注入をどのように管理しますか?

@Component({ 
    selector: 'app-thing', 
    templateUrl: './thing.component.html', 
    styleUrls: ['./thing.component.scss'] 
}) 
export class ThingComponent { 

    constructor(
    private thingService: ThingService) { 
    } 
} 
+2

このhttps://angular.io/docs/ts/latest/guide/dependency-injection.htmlを参照してください。 –

+1

それは本当に私のためにそれをクリアしていません。私はそれをどのように使うのか知っていますが、それが何であるかはわかっていますが、私はそれを自分で実装するのに十分理解していません。 –

答えて

2

私が正しく理解していれば、より理論的な答えを得ることができます。

私が読んだことによると、 angular2注入システムは、そのプロバイダオブジェクト/関数のインスタンスを作成し、それをコンストラクタのように定義するときに、そのコンポーネントでそのインスタンスを使用します。使用しているコンポーネントで提供していない場合は、使用されているモジュールまで親コンポーネントに移動します。各レベルには独自のプロバイダインスタンスのマップがあり、コンポーネントは注入ツリーを上向きに横断するときに最初に見つかったインスタンスを使用します。

だから、プロバイダは、それが定義されている地点までのシングルトンインスタンスになります。ボンネットの下に何が起こる

+0

Angularがコンポーネントコンストラクタのどの順番にどのプロバイダを配置するのかを特定するメカニズムを探しています –

+0

@MildFuzzコンストラクタに別のサービスを追加すると、最初に呼び出すサービスのようになりますか?サイクリック依存関係の質問のように? – echonax

+0

別のサービスがあり、それを注入した場合、Angularは 'ThingService'がコンストラクタの最初の引数であり、2番目の引数ではないことをどのように知っていますか? –

3

は活字体が生成ES5コード内のメタデータを保持していることです。したがって、コンストラクタ内の注釈は実際にはなく、実行時に使用できます。その後、AngularのDIはそこから取得できます。次の要件が満たされた場合

活字体は常にそのメタデータを保持します:

  1. どちらのコンパイラオプションのプロパティ - emitDecoratorMetadataexperimentalDecorators - true
  2. に設定する必要が上の少なくとも一つのデコレータがなければなりませんいくつかのサービスクラスが@Injectable()デコレータを使用する理由があります。そうしないと、依存関係のメタデータは出力されません)

私はそのトピックに関する詳細な記事を書いてくださいhere

関連する問題