AngularJS $ provider和$ injector和bootstrapping

时间:2014-08-28 23:12:57

标签: angularjs angularjs-service

我一直试图通过角度DI和真正的自举过程深入了解细节,我对事情真正发生的地方感到有些困惑。在我看来,事件按此顺序排列。 应用程序启动。

  1. $ provider注册服务提供商。
  2. 在配置阶段,可以配置提供程序。
  3. 现在是我迷失的地方。

    现在可以从$ provide访问所有已配置的提供程序的$ injector调用构造函数(每个提供程序中的$ get函数)来实例化服务实例。

    此外,如果该过程正确,$ injector如何处理服务依赖于其他服务的情况?

1 个答案:

答案 0 :(得分:1)

服务仅在需要时才实例化,而不是在Angular的启动期间实例化。例如,如果您有一个尚未激活的控制器,并且它依赖于尚未使用的服务,那么只要该控制器变为活动状态,这些服务就会被实例化并注入(如更改为用它)。从那时起,将使用每个服务的相同实例。

依赖于其他服务的服务也是如此。在实例化之前,所有依赖项都会被解析,因此如果依赖项具有依赖项,则应用相同的进程(所有依赖项的依赖项将首先实例化,依此类推)。

如果找到循环依赖项(service foo具有依赖于服务foo的依赖项),Angular将抛出异常,并且必须将这些服务的功能重构为不同的服务不会有这种循环链。