Angular指令通过@Input访问ng-container内ElementRef报NG0100错误如何解决
错误原因
#viewEl时会出现「首次检测拿到实例、二次检测时实例还未完成挂载判定为undefined」的时序差,最终触发NG0100变更检测不一致错误。
修复方案
方案1:调整指令查询逻辑(无需修改组件结构)
在公共指令内通过setter接收查询结果,仅在元素实例存在时存储副本,天然兼容不同初始化时序的元素:
// 公共指令内代码 private _savedViewEl: ElementRef; // 保留的viewEl副本,供后续使用 @ViewChild('viewEl') set viewEl(instance: ElementRef) { // 仅当实例存在时更新副本,避免存到undefined if (instance) { this._savedViewEl = instance; } }
如果需要在拿到实例后执行后续操作,直接在setter内部调用对应逻辑即可。
方案2:异步赋值+主动标记变更
如果需要保留原有类属性写法,可将赋值逻辑放到微任务队列,避开当前变更检测周期的同步校验:
// 公共指令内代码 @ViewChild('viewEl') viewEl: ElementRef; savedViewEl: ElementRef; constructor(private cdr: ChangeDetectorRef) {} ngAfterViewInit() { Promise.resolve().then(() => { this.savedViewEl = this.viewEl; // 主动标记变更,避免后续视图更新不生效 this.cdr.markForCheck(); }) }
方案3:调整comp1结构(最简便)
直接去掉comp1中不必要的
<!-- comp1修改前 --> <ng-container> <span #viewEl></span> </ng-container> <!-- comp1修改后 --> <span #viewEl></span>
修改后两个组件的#viewEl初始化时序完全一致,不会出现时序差导致的报错。
内容的提问来源于stack exchange,提问作者AllenEyes
相关产品推荐
相关产品推荐

