2017-03-09 5 views
2

私はPluralSightでAngular 2 Getting Startedを見てきましたが、作成されたサービスの一部がAppコンポーネントとModuleコンポーネントに注入されていました。サービスをAngular 2モジュールレベルとアプリケーションコンポーネントレベルに挿入するタイミング

角度2でRouterGuardを作成、RouterGuardのために作成サービスは、モジュールレベルで注入されているが、いくつかのカスタムサービスは唯一のアプリケーションコンポーネントレベルに注入されています

は、ここでの例です。私の質問は、いつモジュールレベルにサービスを注入し、いつAppコンポーネントレベルにのみ注入するのかです。

ありがとうございます!

答えて

8

実際、モジュールレベルとコンポーネントレベルでサービスを提供することができます。あなたは、このようなNgModuleのproviders配列でそれをリストすることによって、モジュールレベルでサービスを提供することができます。

@NgModule({ 
    declarations: [ 
     ... 
    ], 
    imports: [ 
     ... 
    ], 
    providers: [MyService], 
    bootstrap: [AppComponent] 
}) 

あなたがこれを行うと、あなたはモジュール全体とすべての子供たちを越え同じインスタンスを提供しています。

しかし、時には、個のインスタンスに対して個別のインスタンスのサービスをコンポーネントに提供することができます。

@Component({ 
    templateUrl: './app.component.html', 
    providers: [MyService] 
}) 

これはちょうどこのコンポーネントのサービスの新しいインスタンスを提供します。その場合は、次のようなコンポーネントのデコレータでproviders配列にそれをリストすることによって、コンポーネントレベルでのサービスを提供することができます。

モジュールレベルでサービスを提供する場合の1つの例は、サービスを使用して複数のコンポーネントで共有されるデータを保持する場合です。これは、サービスに格納されているが、いくつかのコンポーネントで使用されている変数またはオブザーバブルを使用している可能性があります。サービスがステートレス(Http呼び出しからのobservablesのみを返す)である場合、モジュールレベルでサービスを提供したい場合もあります。これらのシナリオでは、共有インスタンスを持つことが理にかなっています。

また、データを保持するサービスを提供することもできますが、各コンポーネントには独自のインスタンスが必要です。このシナリオでは、サービスをコンポーネントレベルで提供することが理にかなっています。

希望に役立ちます。

+1

私はモジュールまたはアプリレベルで "提供する"と言います。注入とは、インジェクタがインスタンスを作成し、その値をコンストラクタに渡すときにインジェクタが行うことです。 –

+1

本当に十分です。私は概念を過度に単純化したかもしれない。 –

+0

モジュールレベルで挿入すると共有されますが、コンポーネントレベルで挿入すると共有されません。シングルトンサービスインジェクションを使用するには、モジュールレベルで使用します –

関連する問題