簡體   English   中英

Angular2 - 注入@Injectable

[英]Angular2 - inject into @Injectable

我有一個Angular2應用程序,其中包含用於從API獲取數據的service 這個例子之后,我想創建一個單獨的文件,其中應該包含一些配置數據。 我的問題是我的服務有一個@Injectable()裝飾器,我不確定我是否可以在元數據中傳遞一個provide數組,我將在其中注入配置,如教程中所示。 有人遇到過這樣的問題,歡迎分享他的解決方案:)

實際上,Angular2利用分層噴射器和噴射器鏈接到組件。 簡而言之,您只能在組件( providers屬性)或應用程序級別( bootstrap功能)上定義提供程序。

關於服務,他們將能夠使用對發起呼叫的組件可見的提供者,但是您無法在其級別定義提供者。

這是一個示例:

Application
     |
AppComponent
     |
ChildComponent
  getData()     --- Service1 --- Service2

在這種應用中,我們有三個注射器:

  • 可以使用bootstrap函數的第二個參數配置的應用程序注入器
  • 可以使用此組件的providers屬性配置的AppComponent注入器。 它可以“看到”應用程序注入器中定義的元素。 這意味着如果在此提供程序中找不到提供程序,它將自動查找此父注入程序。 如果在后者中找不到,則會拋出“找不到提供者”錯誤。
  • ChildComponent注入器將遵循與AppComponent相同的規則。 要注入為組件執行的注入鏈中涉及的元素,將首先在此注入器中查找提供者,然后在AppComponent者,最后在應用程序中AppComponent

這意味着,試圖將注入時, Service1ChildComponent構造,Angular2將調查ChildComponent注射器,然后進入AppComponent一個最后進入應用程序之一。

由於Service2需要被注入到Service1 ,相同分辨率的處理會做到: ChildComponent注射器, AppComponent一個應用程序之一。

這意味着可以使用組件的providers屬性和應用程序注入器的bootstrap函數的第二個參數,根據您的需要在每個級別指定Service1Service2

這個答案可以幫助你:

這有點奇怪,但只有組件可以在Angular(well和bootstrap()配置依賴注入,但這與root組件基本相同)。 即,只有組件可以指定提供者。

正如@Thierry在他的回答中提到的,如果組件具有指定的providers數組,則組件樹中的每個組件將獲得關聯的“注入器”。 我們可以把它想象成一個注入器樹,它(通常很多)比組件樹更稀疏。 當需要解析依賴關系時,將查詢此注入器樹。 能夠滿足依賴性的第一個注入器就是這樣做的。 注入器樹朝向根組件/注入器向上走。

因此,為了使您的服務注入配置對象依賴項,首先必須使用注入器注冊該配置對象。 即,在組件的providers數組中,調用
provide(stringToken or OpaqueToken, {useValue: MyConfigObject} )
此注冊必須發生在您要使用/注入服務的組件或其上方某處。

然后,您的服務應該能夠@Inject注冊的配置對象,因為它將在注入器樹中找到它。

請注意,由於只有組件可以配置提供程序,因此@Injectable()裝飾器不支持任何配置選項,因此不支持providers數組。

這不受支持。 對於服務,需要將提供程序添加到bootstrap(AppComponent, [..., Service, ServiceDependency1, ...])

另見https://github.com/angular/angular/issues/5622

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM