You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:35:19