2017-10-04 99 views
1

我有一個服務A.該服務獲得另一個服務B注入。 所以A使用B. B被A使用並注入As構造。Angular 2:服務注入服務,Provider

在組份I使用的服務答:我不直接使用服務B.但是,A使用B,因爲B被注入A.

在這部分我需要把

providers: [A, B] 

如果我只把A放到提供商

"ERROR: No provider for B" 

在瀏覽器的Javascript控制檯中。我沒有收到編譯器錯誤。

有沒有辦法隱藏組件提供程序中未直接使用的其他服務?

我不喜歡將B放入組件提供程序,而不是直接使用它。

謝謝!

編輯

我可以把所有的服務到模塊提供者,然後我不能將它們設置在我使用服務的任何部件。但是這樣做有沒有負面影響?

+1

您可以在模塊中提供服務B,以便您不必在每個組件中提供它。 – omeralper

+1

DI提供提供者。每個組件和模塊都有自己的注射器,如果注射器無法找到提供者,它會詢問其父注入器,直到模塊出現爲止。在服務A中使用服務B並不意味着服務B將被提供。組件或模塊必須提供它。 – omeralper

回答

1

好像你完全不瞭解DI是如何工作的角...請仔細閱讀https://angular.io/guide/hierarchical-dependency-injection#injector-bubbling

長話短說:

  • @NgModule({providers:[]}) export class AppModule{}在整個應用程序提供
  • @NgModule({providers:[]}) export class UserModule在所有可用@Component s和@Injectable s在當前模塊中註冊
  • @Component({providers:[]})可用於此組件(和ch ildren,但有一些例外)
  • @Component({providers:[]})創建新的注射器。在實踐中,這意味着如果您的頁面上有3個組件,則每個組件都有一個注入服務的NEW實例。即在這種情況下,您不會在組件之間共享任何內容。該功能很少需要...
  • Injector解決了DI樹時,它搜索OWN註冊@Injectables,如果沒有發現任何東西,那麼它會問父母。這意味着如果您的Service1取決於Service2,那麼必須在@Component@NgModule中提供Service2,並且Angular仍然能夠解析DI樹。
  • 將所有@Injectable s放入@NgModule並沒有什麼缺點,而且這是「角度方式」。在大多數情況下有個人@Component({providers:[]})是過度的,理論上應該會減慢你的應用程序。所以只有當你真的需要每個組件的新服務實例時才使用它。