Angular 15中路由组件嵌套Shell后出现变更检测错误的排查求助
Angular 15中路由组件嵌套Shell后出现变更检测错误的排查求助
大家好,我最近在Angular 15项目里碰到了一个头疼的问题,想请各位大佬帮忙出出主意!
事情是这样的:我给项目里某一个功能模块加了新路由后,不得不重构主路由组件,把它嵌套进了一个Shell组件里。这个Shell组件逻辑非常简单,代码如下:
import { Component } from '@angular/core'; import { NAVIGATION_ROUTES } from '../../@shared'; @Component({ selector: 'calendar-shell', template: `<router-outlet></router-outlet>` }) export class CalendarShellComponent { public componentPath = NAVIGATION_ROUTES.calendar.path; }
这一步确实解决了路由的问题,但麻烦事来了——原来那个用了4年、一直负责该核心功能编排的主组件,突然开始到处冒变更检测错误,而且完全没规律:这次在某个变量的赋值处报错,下次刷新可能又跑到另一个子组件的Input传值位置,根本没法彻底根治。
说下组件的基础情况:主组件里大部分核心变量,都是通过订阅服务中的BehaviorSubject、Subject这类可观察对象来赋值的;子组件基本都是通过Input接收这些变量。之前这么实现一直没出过问题,但自从套了这个Shell组件后,变更检测就彻底乱了。
我已经尝试过的方案:
- 给主组件和子组件加上
OnPush变更检测策略 - 手动调用
cdr.markForCheck()触发变更检测
但这些都没起作用——有时候必须晃动鼠标,页面才会检测到变更并更新。
因为这个主组件和对应的模板实在太大了,没法完整贴出来,但逻辑真的很基础,就是常规的订阅、Input传值这些操作,没有特别复杂的逻辑。
有没有大佬能给点排查方向或者解决思路?真的快被这个问题搞疯了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

