我不知道是誰寫的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)是正確的。
嚴格的第一點是真實的。 https://angular.io/docs/ts/latest/api/core/index/Injectable-decorator.html – silentsod
@silentsod感謝,並修正第二? – Kuan