2

我有一个角度服务,在其构造函数中包含一些初始化代码。这段代码是什么时候调用的,即服务是什么时候创建的?

  • 已经在某个模块中提供了服务?
  • 或者直到第一个组件注入它?
4

3 回答 3

4

取自官方文档

当 Angular 发现一个组件依赖于一个服务时,它首先检查注入器是否有该服务的任何现有实例。如果请求的服务实例尚不存在,则注入器使用注册的提供者创建一个,并将其添加到注入器中,然后再将服务返回给 Angular。

当所有请求的服务都被解析并返回后,Angular 可以使用这些服务作为参数调用组件的构造函数。

因此,似乎只有在第一次需要时才实例化服务。

事实上,Angular 甚至可以识别该服务是否永远不会被使用,如果不需要,则将其从构建中删除(取自此处此处)。

自己测试一下

验证这一点的一个简单测试是将console.logs 同时放入组件和服务中,以查看调用的顺序。

于 2019-08-29T09:21:47.463 回答
2

在第一个组件注入它之前,请通过下面的链接。

当 Angular 创建组件类的新实例时,它会通过查看构造函数参数类型来确定该组件需要哪些服务或其他依赖项。

https://angular.io/guide/architecture-services

于 2019-08-29T09:26:00.467 回答
1

如果您在模块上引用,服务会在组件需要之前运行构造函数,

@NgModule({
  providers: [
  TestService],
 ...
})

如果在组件上引用,服务会为组件创建一个新实例

@Component({
  selector:    'app-xpto',
  templateUrl: './xpto.html',
  providers:  [ TestService ]
})
于 2019-08-29T09:30:35.440 回答