angular 中注入的服务的构造函数何时运行?

sda*_*kas 11 typescript angular angular7

在 Angular 7 中,如果我们有一个声明为 @Injectable({providedIn: 'root'}) 的服务,它的构造函数何时执行?它是在构建使用它的组件(作为依赖项)时执行还是等到该服务中的方法首次被调用?

注意:由于服务是单例,我使用服务的构造函数来初始化一些值。我可以创建一个“Initialize()”方法并在组件的构造函数中调用它,但我发现这种方法有点混乱。

Mic*_*ely 6

注入服务的实例是在首次创建需要它们的组件时或首次实例化需要它们的另一个服务时创建的。

当创建(或实例化)需要服务作为依赖项的组件(或另一个服务)时,Angular 会扫描依赖项注入树,并查找定义(以及注入服务的实例)。如果没有找到注入服务的实例,Angular 会创建注入服务的实例,然后它的构造函数才会运行。

在创建需要服务的对象(或另一个服务)之前实例化服务的另一种方法是将其作为依赖项添加到数组中APP_INITIALIZERdeps如下所示:

{ provide: APP_INITIALIZER, useFactory: () => () => null, deps: [MyService], multi: true }
Run Code Online (Sandbox Code Playgroud)

这将在应用程序初始化时创建一个实例,MyService无论何时创建需要它的其他组件/服务。更多详细信息请参见此处


cyr*_*r_x 5

Injectable特定范围的注入器在初始化该类/服务时调用用装饰器装饰的类的构造函数。您不能在一个范围内拥有同一服务的多个实例,除非您通过{ provide: MyService, useClass: MyService, multi: true }.

provideIn选项定义了服务所属的范围,因此 usingprovideIn: 'root'告诉 DI 通过使用 RootInjector 来注入服务。而且由于服务不会在一个范围内多次初始化,当 DI 需要第一次将该服务注入另一个组件/服务/模块时,该服务的构造函数只会被调用一次。

  • 我有一种情况,注入服务的组件构建正常,但服务的构造函数没有运行。尽管服务的方法运行正常,但我可以从组件内部调用它们,并且它们可以正常工作。 (5认同)