当我从 ChangeDetectorRef 调用 detach() 时,为什么会调用 ngDoCheck() ?

Cru*_*ine 5 observable angular angular-changedetection

我正在阅读一些有关更改检测的文章,并且尝试使用 和 启用或禁用更改changeDetectorRef.detach()检测changeDetectorRef.reattach()

我还将该组件挂接到唯一ngDoCheck()发现ngDoCheck()即使在之后也被调用detach()。我究竟做错了什么 ?有人可以解释为什么ngDocheck()被称为吗?我什至也有ChangeDetectionStartegy设置OnPush这是我正在阅读的文章以了解变更检测

我还为此创建了一个示例:https ://stackblitz.com/edit/angular-4ytdbs

Pie*_*Duc 0

这是因为detach()将组件与其自己的组件分离ChangeDetector,使其不检查模板/输入/主机绑定。这与正在做的事情是不同的ngDoCheck。这用于实现一种自定义更改检测,以检测您知道将会发生但 Angular 无法预测的更改。应用程序中任何地方的任何循环都会调用它。

我想不让你的代码在你的内部运行的唯一方法ngDoCheck是在分离时设置一个标志:

ngDoCheck(): void {
  if (attached) {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

但我相信你也已经明白了这一点:)

@selemmn 提供的链接确实提供了很好见解