2017-02-23 441 views
0

我正在學習angular2,並發現自己有時會有點混淆注入依賴關係。喜歡用RouteParamsAngular 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

如果它們是指令,它是'聲明'(不是'指令'!)。如果他們是提供者,那就是「提供者」。如果你將一個未在'providers'中定義的提供者傳遞給構造函數,它將會拋出一個錯誤。它是如此簡單。您使用的是一些真正棄用的示例(alpha或beta)的代碼。我會建議RTM,而不是老的教程。相當長時間內,無論是指令還是提供者都不需要明確從路由器模塊導入。 – estus

+0

'ROUTER_DIRECTIVES'已經過時了。你使用的是什麼Angular版本?它應該是'RouterModule'並進入'進口:''@NgModule()'' –

回答

0

依賴關係是根據他們所做的事情來定義的。

有一種瘋狂的方法,但當你開始肯定時,它是壓倒性的。看看https://angular.io/docs/ts/latest/guide/architecture.html

基本上指令操縱DOM,依賴注入注入一個完整的類(及其所有的依賴)等等。所以有特定的方式/地方告訴Angular什麼是什麼。

希望這些文檔有助於爲您解決問題。大約一半的時間開始討論指令和注射。

0

DI使用提供者創建並保存一個值。

如果您註冊提供商@NgModule({providers: []})@Component({providers: []})@Directive({providers: []})定義了什麼值或實例將傳遞給依賴於它們的構造函數。

如果您在非延遲加載的註冊提供商@NgModule() DI將爲其根範圍內的整個應用程序提供一個實例。

如果您在@Component()或@Directive()上註冊供應商,則DI將爲每個組件或指令實例提供一個實例。

如果MyComponent提供服務A和有您的網頁上的MyComponent 5個實例,則會有高達A 5個實例(供應商只創建當請求第一次一個實例)。

當組件,指令或管道具有構造函數參數時,DI將嘗試查找與參數類型或裝飾器(如果有)匹配的提供者。 DI開始查看提供者的主機組件,並將其保存的實例傳遞給構造函數。如果主機組件不提供匹配的提供者,DI會一直查看父組件,直到它找到一個爲止。如果它到達根組件(AppComponent),但仍未找到提供程序,它將檢查根作用域(@NgModule()提供程序)。

延遲加載的模塊有點特殊,因爲註冊的提供者不能添加到根作用域。一旦範圍(噴射器)被創建,新的提供者就不能被註冊。

延遲加載的模塊爲應用程序根作用域創建子作用域。 在那裏註冊的提供者只對組件,指令,管道和服務是可見的,這些組件是延遲加載模塊的一部分(以及加載了延遲加載模塊的導入模塊)。