Angular服务状态未保留?如何让Guard获取正确的inc值
问题分析与解决方案
问题原因
你的TestService出现了多实例情况:组件调用assign()修改的是根注入器中的服务实例,但守卫调用reassign()时使用的是另一个新创建的服务实例,所以inc值还是初始的1。
虽然服务配置了providedIn: 'root'(默认会在根注入器中创建单例),但如果在某个模块(比如路由模块)或独立组件的providers数组里重复声明了TestService,Angular会在该局部注入器中创建新的实例,导致组件和守卫使用不同的服务实例。
解决方案
1. 清除重复的服务提供配置
检查所有模块(包括路由配置所在的模块)和独立组件的providers数组,确保没有重复添加TestService。只保留服务本身的providedIn: 'root'配置即可:
// test.service.ts(正确配置) @Injectable({ providedIn: 'root' // 仅保留这一行,确保单例 }) export class TestService { // ... 原有代码 }
2. 验证服务的单例性
在TestService的构造函数中添加日志,确认是否被多次实例化:
constructor() { console.log('TestService 实例已创建'); }
如果控制台输出多次这条日志,说明存在重复提供的地方,找到并删除对应模块/组件中的providers: [TestService]配置。
3. 确认守卫的注入逻辑
函数式守卫中使用inject(TestService)会默认从根注入器获取实例,只要没有局部提供服务,就会和组件使用同一个实例,此时调用reassign()时inc的值会是组件修改后的2。
验证结果
修复后,控制台输出会变为:
FromComponent 2 FromGuard 2
内容的提问来源于stack exchange,提问作者ELavicount
相关产品推荐
相关产品推荐

