2014-08-28 38 views
0

我一直試圖進入角度DI的基本原理,真的是引導過程,我對有些事情真的發生了一些困惑。在我看來,事件是按照這個順序。 應用程序啓動。

  1. $ provider註冊服務提供商。
  2. 在配置階段,可以配置提供者。

現在是我迷失的地方。

$ injector,現在可以訪問$ provide中的所有配置提供程序,調用構造函數(每個提供程序中的$ get函數)來實例化服務實例。

另外,如果這個過程是正確的,$注入器如何處理服務依賴於另一個服務的情況?

回答

1

服務僅在需要時才被實例化,而不是在Angular啓動時實例化。例如,如果您的控制器尚未激活,並且依賴於尚未使用的服務,則只要該控制器處於活動狀態(如更改爲使用該控制器的視圖),就會實例化和注入這些服務。從此,將使用每個服務的相同實例。

依賴其他服務的服務也是如此。在實例化之前,所有依賴關係都被解析,所以如果依賴關係具有依賴關係,則應用相同的進程(所有依賴關係的依賴關係將首先實例化,依此類推)。

如果循環依賴被發現(服務foo具有依賴於服務foo的依賴),角將拋出一個異常,並且這些服務的功能將不得不被重構到,不會有這種圓形的不同服務鏈。

+0

感謝您的快速響應。作爲最終的澄清,誰正在調用服務構造函數,$ provide或$ injector?編輯:nvm,它是使用實例化方法的$注入器..再次感謝! – Derek 2014-08-28 23:46:36

+0

'$ injector'沒有實例化: https://docs.angularjs.org/api/auto/service/$injector https://docs.angularjs.org/api/auto/service/$provide – m59 2014-08-28 23:49:54