角度变化检测:为什么要检查整个树的局部变化?

Hof*_*off 5 angular2-changedetection angular

假设我有一个简单的文本数组:

textContent = [
    {text: 'good morning'},
    {text: 'lovely day'},
    {text: 'for debugging'},
  ]
Run Code Online (Sandbox Code Playgroud)

我为每个组件渲染一个简单的组件,并传入文本项作为输入:

<app-text *ngFor="let text of textContent" [text]="text"></app-text>
Run Code Online (Sandbox Code Playgroud)

文本组件渲染文本,用ngModel:

<textarea [(ngModel)]="text.text"></textarea>
Run Code Online (Sandbox Code Playgroud)

我还登录了 DoCheck:

ngDoCheck() {
    console.log(this.text.text, ' has been checked')
}
Run Code Online (Sandbox Code Playgroud)

当我在一个文本区域中输入某些内容时,所有其他组件的 DoCheck 都会被触发。

good morning   has been checked
lovely days    has been checked
for debuggings has been checked
Run Code Online (Sandbox Code Playgroud)

即使使用 OnPush 进行更改检测,也会发生这种情况。

问题:为什么对一个组件的数据进行更改会触发检查整个树?

(对于少数组件来说这不是问题,但是对于较大的树,我会丢帧)。

我实际上注意到,即使是完全独立的内容树上的组件也会触发其“doCheck”。

有没有办法防止这种情况发生,或者我完全错过了其他东西?

Hof*_*off 1

我的问题是基于我的误解,所以让我澄清一下:

\n\n

当组件的 DoCheck() 生命周期挂钩被调用时,这并不意味着它已被检测到更改。这仅意味着 Angular 正在执行更改检测运行,并为您提供了挂钩它的机会,以执行一些自定义逻辑。

\n\n

本文如果您认为ngDoCheck您的组件正在被检查\xe2\x80\x8a\xe2\x80\x94\xe2\x80\x8a,请阅读本文有更多详细信息。

\n