2016-11-21 62 views
1

This tutorial並不多談模塊如何適應注射器樹除了這句話:如何中介模塊供應商融入注射器樹

的所有請求都泡到根NgModule注射器,我們 使用bootstrapModule方法進行配置。

這是否意味着如果在樹上的任何組件上找不到提供者,則只檢查根模塊並且沒有檢查其他中介模塊?例如,下圖顯示了具有一個根組件的組件樹,以及在其自己的模塊中聲明組件3和4的組件樹。根模塊有它自己的提供者,紅色模塊有它自己的提供者。當組件3請求服務時,忽略紅色模塊上的提供程序並檢查父組件上的提供程序,如果找不到比根模塊上的提供程序更新的提供程序? enter image description here

+0

你可以使用augury來檢查你的依賴關係圖。 – Manish

+0

@ user32,謝謝,我會看看 –

回答

1

我認爲你正在尋找https://angular.io/docs/ts/latest/cookbook/ngmodule-faq.html#!#q-module-provider-visibility

爲什麼一個功能模塊,隨處可見中提供的服務? 引導程序模塊 的@ NgModule.providers中列出的提供程序具有應用程序範圍。添加一個服務提供商 @ NgModule.providers有效地發佈服務於整個 應用。

當我們導入模塊時,Angular將模塊的服務提供商 (其提供程序列表的內容)添加到應用程序根注入器。

這使得供應商在 知道供應商的查詢令牌的應用程序的每個類可見。

這是由設計。通過模塊導入實現的擴展性是Angular模塊系統的主要目標 。合併模塊供應商到 應用注射器,很容易讓一個模塊庫,充實新的服務 整個應用程序。通過添加一次HttpModule,每個應用程序組件都可以發出http請求。

但是,如果您期待 模塊的服務僅對 聲明的特徵模塊可見的組件可見,這會感覺不受歡迎的驚喜。如果HeroModule提供HeroService和 根的AppModule進口HeroModule,雖然知道 HeroService類型可以注入在HeroModule宣稱的服務,而不僅僅是類 任何類。

模塊的提供者添加到根的範圍。丟棄重複項。這意味着提供程序可以從整個應用程序中找到,除非它們在組件或延遲加載的模塊上被重寫。延遲加載的模塊獲取它們自己的根作用域。

如果紅色模塊被延遲加載,那麼組件3將從該模塊獲取提供程序,如果它急於加載,則將紅色模塊的提供程序添加到應用程序的根作用域,組件3將從那裏獲取它。這是所有與由添加到@Component()@Directive()@NgModule()

提供商添加並不提升到任何根範圍提供商。 DI從對其父代及其父代有依賴關係的組件中查找,對於提供者以及最後在應用程序的根作用域中或在延遲加載模塊的根作用域中查找(如果組件是一個組件的一部分) 。

+0

謝謝,但你能解釋在問題中提出的特定情況下會發生什麼嗎? –

+0

模塊的提供者被添加到根作用域。丟棄重複項。這意味着提供程序可以從整個應用程序中找到,除非它們在組件或延遲加載的模塊上被重寫。延遲加載的模塊獲取它們自己的根作用域。 –

+0

我明白了,謝謝。那麼你在說什麼,在我的特殊情況下,它取決於紅色模塊是否被延遲加載,是否正確?如果延遲加載,那麼組件'3'將從註冊在紅色模塊上的提供程序獲得服務,如果它被急切加載,則將使用比根模塊上的提供程序更多的服務? –

相關問題