为什么Angular中Observable在服务中生效但在组件中订阅无响应?
问题原因
- 核心错误是你在
datagrid.component.ts的@Component装饰器中额外配置了providers: [DataService],这会触发Angular的依赖注入机制为当前组件创建一个全新的独立DataService实例,和你全局注册的、以及datagrid.service.ts中注入的DataService不是同一个对象。 - 你触发
changeFilters方法调用时使用的是全局实例,事件只会推送到全局实例的URLSubChange$Observable上,组件内订阅的是自身单独实例的Observable,自然收不到任何事件通知。而datagrid.service.ts中注入的是全局共享的DataService实例,所以订阅可以正常触发。
修复方案
- 直接删除
datagrid.component.ts中@Component配置里的providers: [DataService]字段即可。删除后Angular会向上查找最近的公共注入器中注册的DataService实例,保证组件和其他地方使用同一个服务实例,订阅就能正常接收事件。
注意:如果你的业务场景确实需要当前组件拥有独立的DataService实例,那么你触发
changeFilters的逻辑也必须调用当前组件注入的这个独立实例的方法,否则事件仍然无法被对应订阅接收到。
内容的提问来源于stack exchange,提问作者Waseem Parker
相关产品推荐
相关产品推荐

