Angular组件服务实例共享疑问:父组件提供服务的实例一致性问题
嘿,这两个问题其实是Angular依赖注入里最基础也最关键的点,我来给你掰扯清楚:
第一个问题:P、B、C中的MyService实例是不是同一个?
答案是肯定的,三个组件拿到的是同一个实例。
Angular的DI系统是按注入器层级来工作的:
- 你在
PComponent的providers里声明了MyService,这就告诉Angular:在P组件对应的ElementInjector里创建这个服务的单例。 - 子组件B和C自己的
@Component里没加providers: [MyService],所以它们的注入器会往上找——先找父组件P的注入器,发现这里有现成的MyService实例,就直接拿来用了。 - 哪怕P组件自己不在构造函数里注入这个服务,只要它的
providers里声明了,子组件还是会共享这个实例。所以不管是P、B还是C,构造函数里拿到的myservice都是同一个对象。
你可以加个小测试验证:在MyService的构造函数里打印console.log('实例创建:', this),三次注入会输出完全一样的对象引用。
第二个问题:仅在B、C中注入,P不注入,B和C会有独立实例吗?
结合你给的代码(B、C都没自己声明providers),不会,B和C还是会共享同一个MyService实例——就是P的注入器提供的那个。
这里要搞明白一个核心逻辑:服务的实例是由提供它的注入器决定的,不是由谁注入它决定的。只要P的providers里挂了MyService,它的注入器就会维护这个单例,不管P自己用不用,子组件找不到自己的提供者时,就会复用父组件的这个单例。
那什么时候B和C会有独立实例呢?要是你给B和C各自的@Component里加上providers: [MyService],那它们的ElementInjector就会各自创建一个MyService实例,互相不干扰。比如:
// B组件修改后 @Component({ selector:'Bcomp', ... providers:[MyService] }) export class BComponent { constructor(public myservice:MyService){} }
同样给C组件也加上这行,这时你会看到控制台打印两次My Service instantiated,说明B和C各有一个独立的实例。
内容的提问来源于stack exchange,提问作者Rishav Mahapatra
相关产品推荐
相关产品推荐

