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

Angular从13升级到15.2.9后仅触发SCROLL EVENT,路由异常求助

Angular 13升级到15.2.9后路由仅触发SCROLL EVENT无Navigation End的排查与解决

1. 检查滚动恢复配置

Angular 14+对路由滚动恢复的实现做了调整,scrollPositionRestoration的默认行为和配置逻辑有变化。如果你的路由配置中设置了scrollPositionRestoration: 'enabled',可能会导致异常的SCROLL事件优先触发,而Navigation End事件被掩盖。

  • 尝试将配置改为'top'或者disabled,验证是否恢复正常:
@NgModule({
  imports: [
    RouterModule.forRoot(routes, {
      scrollPositionRestoration: 'top',
      // 保留其他必要配置
    })
  ]
})

2. 排查Router事件订阅的过滤逻辑

升级后如果你的代码中对Router事件做了过滤,可能误将Navigation End事件排除在外:

  • 检查所有订阅router.events的代码,确保没有只保留Scroll事件的过滤条件。正确的订阅应该包含需要的事件类型:
import { NavigationEnd, Scroll } from '@angular/router';

// 示例:同时监听NavigationEnd和Scroll事件
router.events.pipe(
  filter(event => event instanceof NavigationEnd || event instanceof Scroll)
).subscribe(event => {
  if (event instanceof NavigationEnd) {
    // 处理Navigation End逻辑
    console.log('导航完成:', event);
  }
});

3. 检查路由守卫与Resolver状态

如果路由守卫(CanActivate、CanLoad等)或Resolver在升级后出现异常,会导致导航未完成,进而不触发Navigation End:

  • 逐一检查所有路由守卫的返回值,确认没有返回false或未正确解析的Observable/Promise,导致导航终止。
  • 检查Resolver的逻辑,确认数据获取流程正常完成,没有因错误导致导航卡住。

4. 验证Router模块的导入正确性

升级后可能因模块导入错误导致多个Router实例冲突,影响事件流:

  • 确认根模块仅导入一次RouterModule.forRoot,子模块使用RouterModule.forChild配置路由。
  • 检查是否存在重复导入RouterModule.forRoot的情况,避免创建多个Router实例。

5. 清理缓存并重新构建

升级后的缓存文件可能残留旧版本逻辑,导致异常:

  • 执行ng clean清理项目缓存,再运行ng build重新构建,测试路由事件是否恢复正常。

内容的提问来源于stack exchange,提问作者Harshita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:02:43