我一直试图通过角度DI和真正的自举过程深入了解细节,我对事情真正发生的地方感到有些困惑。在我看来,事件按此顺序排列。 应用程序启动。
现在是我迷失的地方。
现在可以从$ provide访问所有已配置的提供程序的$ injector调用构造函数(每个提供程序中的$ get函数)来实例化服务实例。
此外,如果该过程正确,$ injector如何处理服务依赖于其他服务的情况?
答案 0 :(得分:1)
服务仅在需要时才实例化,而不是在Angular的启动期间实例化。例如,如果您有一个尚未激活的控制器,并且它依赖于尚未使用的服务,那么只要该控制器变为活动状态,这些服务就会被实例化并注入(如更改为用它)。从那时起,将使用每个服务的相同实例。
依赖于其他服务的服务也是如此。在实例化之前,所有依赖项都会被解析,因此如果依赖项具有依赖项,则应用相同的进程(所有依赖项的依赖项将首先实例化,依此类推)。
如果找到循环依赖项(service foo
具有依赖于服务foo
的依赖项),Angular将抛出异常,并且必须将这些服务的功能重构为不同的服务不会有这种循环链。