2017-08-15 45 views
1

我正在學習Angular 2,而且我剛學了幾天。當我閱讀Angular 2中的Injectable()概念並嘗試應用tuturial的示例代碼時,請按照以下鏈接:Angular 2 - Dependency Injection,我遇到了問題。Angular注射劑2.它是如何工作的?

他們說我需要把註釋@Injectable()在類與其他類的頂部可以注入,如:

import { 
    Injectable 
} from '@angular/core'; 

@Injectable() 
export class appService { 
    getApp(): string { 
     return "Hello world"; 
    } 
} 

問題是,當我把注射(),我的應用程序仍在運行呢?我怎麼了?順便說一句,有人能幫我弄清楚「Angular 2中的注射是如何工作的?」

+1

註釋實際上只在您的服務存在依賴關係時才需要。但總是將其添加到服務中是一種很好的做法。這是記錄:https://angular.io/tutorial/toh-pt4#injectable-services,https://angular.io/guide/dependency-injection#injectable –

+2

關於你的第二個問題,「如何注入角2工作「,閱讀文檔可能有助於理解這一點。我們不會在這裏爲你重寫它。 –

回答

4

可以清楚地在文件中指出:

當它發生時,你可能會從HeroService第一個版本省略@Injectable(),因爲它沒有注入參數。但是現在你必須擁有它,這個服務具有注入的依賴性。您需要它,因爲Angular需要構造函數參數元數據才能注入Logger

https://angular.io/guide/dependency-injection#why-injectable

因此,在短期,如果您有注射劑噴射器,該@Injectable裝飾解決了循環依賴。


「Angular 2中的注射是如何工作的?」

這只是總結一下角度噴射系統的真正廣泛的問題,創建提供商對象/函數的一個實例,並使用該實例在組件當你在構造函數中注入它。

如果您還沒有提供它在您正在使用的組件中,那麼它將轉到它的父組件,直到它已被使用直到它找到該實例的模塊。每個級別都有自己的提供者實例映射,並且組件將使用向上遍歷注入樹時發現的第一個實例。

因此,供應商將是一個單身實例,直到它被定義的點。

+2

很好的解釋,+1 :) –

+1

@PankajParkar謝謝你好先生:-) – echonax

+1

很好地解釋了答案,+1 – Faisal

0

當你寫一個應用程序,你必須採取以執行注射3個步驟:
1.創建服務類。
2.聲明接收組件的依賴關係。
3.配置注射(在NgModule中用角度注射注射)。因爲它代表了什麼組件將通過注入收到

的服務將被稱爲注射。

@Injectable() 
export class MyService { 
    getData(): void { 
    console.log('Fetching data'); 
    } 
} 

現在,你有東西被注入,下一步,將宣佈要接收時的角度創建組件的依賴關係。在角這樣的
一種方式,就是通過宣佈在我們的組件的構造我們想要的注射劑:

export class MyApp { 
    constructor(private myService: MyService) {} 
} 

當你聲明的組件構造的注入,角度會做一些反思找出類注入。換句話說,angular將會看到我們正在構造函數中尋找MyService類型的對象,並檢查依賴注入系統是否有適當的注入。
使用依賴注入的最後一步是連接我們的組件從注入點注入的東西。這意味着,當組件聲明其依賴關係時,我們需要告訴角度注入哪個東西。 我們通過將MyService添加到我們的NgModule的提供者密鑰來完成此操作。

@NgModule({ 
    declarations: [ MyApp ], 
    imports: [ BrowserModule ], 
    providers: [ MyService ] 
})