javascript - 动态添加元素中的元素引用导致 ExpressionChangedAfterItHasBeenCheckedError:
问题描述
我的模板中有一个参考。此元素是动态呈现的(条件无关紧要):
<div #menu *ngIf="condition">
...
</div>
我在组件中使用它:
@ViewChild('menu')
public set content(content: ElementRef) {
if (content) {
this.menuElement = content;
}
}
我还有另一个元素: <my-component [ngStyle]="setStyles()">
我在组件的 setStyles 方法中使用了我的元素引用:
public setStyles(): {} {
if (this.menuElement) {
const menuHeight = this.menuElement.nativeElement.offsetHeight;
const styles = { // some styles };
return styles;
}
}
问题是我的测试引发了一个错误:错误:ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it is checked。以前的值:'未定义'。当前值:'[object Object]'。任何人都可以帮助我吗?提前致谢
解决方案
很难帮助您不共享所有相关代码,但一个潜在的原因(可能是最常见的原因)ExpressionChangedAfterItHasBeenCheckedError
可能是,例如,您正在更新AfterViewInit
生命周期挂钩中的条件值。这是因为AfterViewInit
在更改检测运行后触发。
如果是这种情况,您可以在OnInit
生命周期挂钩中移动您的条件逻辑。如果问题仍然存在,我建议将更改检测设置为OnPush
( changeDetection: ChangeDetectionStrategy.OnPush
)。
推荐阅读
- c++ - setw 处理字母但不处理破折号和下划线
- asp.net-core - Grafana-LogQL:如何从 json 数组中的键值对象中提取标签
- jenkins - Jenkins/Fortify - 在 Jira 中每次构建后更新 Fortify 结果,并在 Jira 中显示 Jenkins 工作状态
- excel - 嗨“先生” 布拉德·皮特!在列
- elasticsearch - 弹性搜索 - 应用适当的分析器来获得准确的结果
- netsuite - 我可以在一个子公司上使用 2 个关联吗
- android - 带动画的片段交易
- ruby-on-rails - Rails 作为守护进程启动时找不到目录
- javascript - 如何在nodejs redis中递归扫描键
- r - 使用 kable 的 R Markdown 密度图错误