ExpressionChangedAfterItHasBeenCheckedError详细解释
一个angular组件,他的生命周期是这样的
- update bound properties for all child components/directives
- call
ngOnInit,OnChangesandngDoChecklifecycle hooks on all child components/directives - update DOM for the current component
- run change detection for a child component
- call
ngAfterViewInitlifecycle hook for all child components/directives
(点击查看源码)
1,接父节点发来的input参数,并把这时的input参数保存,记为oldInput
2,按ngOnChange,ngOnInit,ngDoCheck的顺序调用自己的生命周期函数
3,如果有子组件,将子组件的input参数下传,并依次调用子组件的ngOnChange,ngOnInit,ngDoCheck参数
4,自身做变化检测,同时更新自己的dom结构,将此时的dom结构保存,记为olddom
5,子组件进行变化检测,同时更新子组件的dom结构
6,子组件调用ngAfterViewInit
7,自身调用ngAfterViewInit
8,如果是开发模式,会进行第2轮循环,重复1-7
9,第2轮循环的1,4步骤如果发现oldInput不等于input或者olddom不等于dom,就会报ExpressionChangedAfterItHasBeenCheckedError错误
如何避免:
1,不要在ngOnChange,ngOnInit,ngDoCheck里面改变父组件下传的input参数
2,不要在ngAfterViewInit里改变父组件或自身的dom结构
3,可以用异步的方式做变更
4,在父组件的ngAfterViewInit最后调用this.cd.detectChanges();(不推荐)
为什么要做这个检测:
是为了保证angular单向数据流的稳定性,数据要保证从父组件流向子组件,如果数据流不是按照从上往下的顺序,就会出现互相依赖的关系,容易造成循环依赖,可能让angular应用出现卡死的状况。
所以如果在开发过程中发现了ExpressionChangedAfterItHasBeenCheckedError的错误,一定要小心排查。
附注:
这篇文章其实是对The Hidden Docs In Angular - ngChina 2019 演讲这个视频前半段的总结。
ExpressionChangedAfterItHasBeenCheckedError详细解释的更多相关文章
- .htaccess语法之RewriteCond与RewriteRule指令格式详细解释
htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签: htaccess it 分类: 网络 上文htacc ...
- cookie的详细解释
突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...
- tar命令的详细解释
tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报 分类: linux/unix ...
- Linux学习笔记15——GDB 命令详细解释【转】
GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- 姿势体系结构的详细解释 -- C
我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include &l ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
随机推荐
- Java学习笔记-基础语法Ⅵ-异常
异常 对于异常,JVM默认处理方案为:把异常名称.异常原因以及异常出现的位置等信息输出在控制台,并且程序停止执行 异常处理方式一:try ... catch public class Demo { p ...
- Python模块 | EasyGui
(Python模块 | EasyGui | 2021/04/08) 目录 什么是 EasyGUI? [EasyGui中的函数] msbox | 使用示例 ynbox | 使用示例 ccbox | 使用 ...
- 766. Toeplitz Matrix - LeetCode
Question 766. Toeplitz Matrix Solution 题目大意: 矩阵从每条左上到右下对角线上的数都相等就返回true否则返回false 思路: 遍历每一行[i,j]与[i+1 ...
- 好客租房17-jsx的样式处理
1行内样式-style <h1 style={{color:"red",backgroundColor:"skyblue"}}> jsx的样式处理 ...
- git bisect:让你闭眼都能定位疑难 bug的利器
摘要:git bisect命令使用二分搜索算法来查找提交历史中的哪一次提交引入了错误.它几乎能让你闭着眼睛快速定位任何源码导致的问题,非常实用. 本文分享自华为云社区<利用好 git bisec ...
- C/C++ 单元自动化测试解决方案实践
vivo 互联网服务器团队 - Li Qingxin C/C++ 开发效率一直被业内开发人员诟病,单元测试开发效率也是如此,以至于开发人员不愿花时间来写单元测试.那么我们是不是可以通过改善编写单元测试 ...
- 重载overload 、重写override
观点:重载和重写完全没有关系要联系到一起,唯一的联系就是他们都带有个'重'字,所以鄙人也随大流把他们放在了一起 注意:下面可复制的代码是正确的,错误的只会上传图片,不上传可复制的代码 重载 1.在同一 ...
- 运筹学笔记12 大M法
引入M,其中M是一个充分大的正数.由此,目标函数也改变为zM. 如此构造的线性规划问题我们记作LPM,称之为辅助线性规划问题,也即在原来的线性规划问题的基础上,改造了其等式约束条件,然后有对目标函数施 ...
- Linux云服务器 磁盘分区失败
背景:阿里云服务器,df -h /dev/vda1有40g,然后想把这40g拆一下,拆成几个分区,挂载到不同的路径下. 行动:需要先卸载挂载的盘,但是umount失败,通过fuser删除盘上的服务失 ...
- 华为云发布桌面IDE-CodeArts
摘要:华为伙伴暨开发者大会2022,发布华为云桌面IDE-CodeArts. 本文分享自华为云社区<华为云发布桌面IDE-CodeArts,让连接更简单.编码更智能>,作者: Huawei ...