kittencup / angular2-ama-cn

angular2 随便问
692 stars 101 forks source link

关于服务,我可以理解只要注入过一次就一直在内存中吗,不像组件所谓的生命周期? #251

Open CK110 opened 7 years ago

CK110 commented 7 years ago
  1. 在AppModule 中provider:[ xxService],我在appComponent 注入使用过一次

  2. 我在一个子模块中 再次注入使用(无论我有没有在子模块中再次使用provider声明),我发现这个xxService 的构造函数是不会再执行的。

  3. 是不是服务就是单例?子模块再次声明也不会有什么影响

hstarorg commented 7 years ago

这个很难一言两语说清。 简单理解:模块是树形结构的(有上下级关系),如果在上层模块实例化(定义在Providers中,则表明会实例化)了的模块,下层的模块只需要引用,不会实例化。

如果在子模块中的providers中也定义了,那么就会重新实例化。但注意,这个重新实例化代表有两个实例,而不是覆盖上层的那个实例。

Adol1111 commented 7 years ago
  1. 对于非lazy的模块,在注册的时候,会把所有模块的服务都会注册到Root,而不会重新实例化。
  2. ng的service是根据组件树建立的,如果在组件上指定providers,则会屏蔽父节点的同名服务。
  3. 对于lazy模块,他和上层模块是隔离的,他能使用Root上的服务,但是其他模块不能使用它的服务。