当前位置:  开发笔记 > 编程语言 > 正文

在Angular2中,为什么在setTimeout之后有2次检查内容和视图?

如何解决《在Angular2中,为什么在setTimeout之后有2次检查内容和视图?》经验,为你挑选了1个好方法。

这是我的代码

@Component({
  template: `

Hello from A

`, pipes: [UpperCasePipe], directives: [NgFor] }) export class AComponent { letters = ['a','b','c','d']; contructor(){ } appendW(index) { // console.log(letter); setTimeout(()=>{ this.letters[index] += "W"; }, 1000) } ... }

Plnkr

在setTimeout之后,对内容和视图进行两次角度检查.有人可以解释一下吗?为什么角度需要检查TWICE?



1> Günter Zöchb..:

Angular利用区域通过修补一些异步API(如addEventHandler,setTimeout,...)来了解事件何时完全处理,然后在每个事件后运行更改检测.

在开发模式下,Angular会在第一个之后执行额外的更改检测.因为两者之间没有任何事件,所以不应该发生任何变化.

如果模型仍然改变,Angular认为这是一个可能的错误.

可能的原因:

视图绑定的字段,getter或函数每次都返回一个不同的实例,这被识别为更改.
这通常使用返回数组的已过滤子范围的函数.除非过滤条件已更改,否则应将此子范围分配给字段并返回相同的高速缓存实例.
Angular仅比较先前和当前返回的数组的标识,并忽略数组(或其他对象)的内容是否仍然相同.

由未在Angulars修补区域中注册的事件调用的代码导致模型更改.
这通常是由未在Angular中初始化的第三方库引起的.如果可能,在Angular中初始化它们,或者通知Angular有关更改(手动触发Angular2更改检测)

在生产模式中,Angular只检查一次并忽略可能的副作用.


"在生产模式中,Angular只检查一次并忽略可能的副作用" - 我不确定你的意思.我会说它有点不同:在生产模式中,由于更改检测图/树仅检查一次,如果有任何副作用,它们可能无法在DOM中正确表示(因此在您的视图中).它们可能会在下一个周期中被拾取,除非对同一条数据产生另一个副作用.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有