2016-12-16 54 views
2

全部:我們什麼時候需要在我們的Angular2服務上使用@Injectable?

我很喜歡Angular2,當我到達依賴注入部分時,@Injectable()表示法讓我感到困惑。只是想確保我的約@Injectable理解()是正確的:

  1. @Injectable()指示類遵循它可以作爲注射服務。
  2. @Injectable()表示該類下面有其他@Injectable()定義的服務注入。

這幾乎是@Injectable()的意思?還有什麼需要特別注意這個符號?

我們不能決定哪種情況發生(或兩者都發生),直到我們查看類定義,它是正確的嗎?

感謝

+0

嚴格的第一點是真實的。 https://angular.io/docs/ts/latest/api/core/index/Injectable-decorator.html – silentsod

+0

@silentsod感謝,並修正第二? – Kuan

回答

4

我不知道是誰寫的documentation for @Injectable或者它被寫時,卻完全是誤導:

這標誌着作爲提供給Injector創造A級標誌的元數據。 ... Injector嘗試實例化一個沒有@Injectable標記的類時將拋出NoAnnotationError

您可以看到在Plunker中這不是真的。所以對於你的問題,(1)是錯誤的。

@Injectable註釋實際上所做的是向Angular提供元數據,以瞭解它需要注入到服務中的內容。如果服務不需要任何注入,那麼服務不需要元數據。但是如果它確實需要注入,並且沒有元數據,您將會收到錯誤,因爲Angular無法解析要注入的參數。

documentation for dependency injection,他們得到它一半權利(與矛盾的聲明)。

爲什麼@Injectable()?

@Injectable()標誌着一個類可用於噴油器實例化。一般而言,試圖實例化未標記爲@Injectable()的類時,注入器會報告錯誤。

碰巧,我們可能從HeroService的第一個版本中省略了@Injectable(),因爲它沒有注入參數。但我們現在必須擁有它,我們的服務具有注入依賴性。我們需要它,因爲Angular需要構造器參數元數據才能注入記錄器。

如果這聽起來不矛盾,我不知道是什麼。第一段聽起來像以前的@Injectable文檔,而第二段是正確的。

只要記住這只是建議我們總是添加@Injectable裝飾我們所有的服務,我們以後可能會決定我們需要添加依賴參數,卻忘了加@Injectable當我們這樣做所以。

我們推薦將@Injectable()到每個服務種類,即使是那些沒有依賴關係,因此,在技術上不要求它。這裏的原因:

  • 未來保證:無需記住@Injectable()當我們在後面添加一個依賴。
  • 一致性:所有服務遵循相同的規則,我們不必奇怪爲什麼一個裝飾缺失。

所以你的電話號碼(2)是正確的。

相關問題