2017-02-23 8 views
0

私はangular2を学んでおり、時には依存関係をどこに注入するのかちょっと混乱しています。 RouteParams角2依存注射 - 依存関係を挿入する場所を知る方法

import {RouteParams} from 'angular2/router'; 

を使用している場合たとえば、同じように私たちはコンストラクタメソッドに渡し、我々は行ってもいいです:

constructor(private _photoService: PhotoService, private _routeParams: RouteParams){ 
    } 

しかし、私たちは同じモジュールからROUTER_DIRECTIVESを使う'angular2/router'

import {ROUTER_DIRECTIVES} from 'angular2/router'; 

ディレクティブの配列に渡す必要があります:

directives: [ROUTER_DIRECTIVES] 

私の質問は、どのように私はそれを渡す必要があるのか​​、ディレクティブまたはプロバイダーの配列に依存関係を渡すのか、またはコンストラクターメソッドに渡すのですか?

+0

ディレクティブの場合、 'declarations'(' directives'ではなく!)です。彼らがプロバイダであれば、それは 'プロバイダー 'です。コンストラクタに 'providers'で定義されていないプロバイダを渡すと、エラーが発生します。それはそれと同じくらい簡単です。あなたは本当に非難されるいくつかの例(アルファまたはベータ)のコードを使用しています。私は古いチュートリアルではなく、RTMに提案します。ディレクティブもプロバイダも、ルータモジュールからかなり長い間明示的にインポートする必要はありません。 – estus

+0

'ROUTER_DIRECTIVES'はかなり古くなっています。どの角度バージョンを使用していますか? 'RouterModule'で' @NgModule() 'の' imports:[...] 'に移動します。 –

答えて

0

依存関係は、それらの機能に基づいて定義されています。

狂気への方法がありますが、確かに始めているときは圧倒的です。 https://angular.io/docs/ts/latest/guide/architecture.html

基本的にディレクティブはDOMを操作し、依存関係注入は完全なクラス(すべての依存関係を持つ)を注入します。したがって、Angularに何があるかを伝える特定の方法や場所があります。

うまくいけば、それらのドキュメントがあなたのためにそれを並べ替えるのを助けてくれることを願っています。ページの半分ほどで、ディレクティブと注入について議論が始まります。

0

プロバイダは、値を作成して保持するためにDIによって使用されます。

プロバイダーを登録する場所@NgModule({providers: []})@Component({providers: []})、または@Directive({providers: []})は、それに依存するコンストラクターに渡される値を定義します。

遅延なしで@NgModule()にプロバイダを登録した場合、DIはそのルートスコープ内のアプリケーション全体に対して1つのインスタンスを提供します。

プロバイダを@Component()または@Directive()に登録すると、DIはコンポーネントまたはディレクティブインスタンスごとに1つのインスタンスを提供します。

MyComponentがサービスAを提供し、あなたのページのMyComponentの5つのインスタンスがある場合は、(それが最初に要求されたとき、プロバイダが唯一のインスタンスを作成します)Aの最大5つのインスタンスが存在します。

コンポーネント、ディレクティブ、またはパイプにコンストラクタパラメータがある場合、DIはパラメータタイプに一致するプロバイダまたは@Inject()デコレータ(存在する場合)を検索しようとします。 DIはプロバイダのホストコンポーネントを調べ始め、保持しているインスタンスをコンストラクタに渡します。ホストコンポーネントが一致するプロバイダを提供しない場合、DIは、それが見つかるまで、親コンポーネントを見続ける。ルートコンポーネント(AppComponent)に達してもプロバイダーが見つからない場合、ルートスコープ(@NgModule()プロバイダー)がチェックされます。

遅延読み込みモジュールは、そこに登録されているプロバイダをルートスコープに追加できないため、少し特殊です。スコープ(インジェクタ)が作成されると、新しいプロバイダを登録することはできません。

遅延読み込みモジュールは、アプリケーションのルートスコープに対する子スコープを作成します。 そこに登録されたプロバイダは、遅延ロードされたモジュール(および遅延ロードされたモジュールでロードされたインポートされたモジュール)の一部であるコンポーネント、ディレクティブ、パイプ、およびサービスにのみ表示されます。

関連する問題