Angular从13升级到15.2.9后仅触发SCROLL EVENT,路由异常求助
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
相关产品推荐
相关产品推荐

