我们如何在没有直接@Output 的情况下检测到 Angular2 中的变更检测已 运行?

How do we detect that Change Detection is been ran in Angular2 without direct @Output?

考虑Angular2

中的以下组件树结构
    A
  B 
D  E  

如果 D 通过单击 B 发出事件,angular2 将自动从根 A 开始更改检测。有没有办法 console.log 即使 D 没有直接向 A 发出事件也能改变检测?

例如 D

html

<div (click)="update($event)"></div>

component

@Output() myOutputName = new EventEmitter();

update(event) {
    this.myOutputName.emit('some vlaue'); 
}

B

(myOutputName)="update($event)"

但是如果 B 没有进一步推动该事件,我无法判断 A 是否是 运行 它的变化检测。

这样做的动机是找出哪个组件具有 Change Detection 运行 用于调试目的

对每个组件实施 ngDoCheck()。它是一个生命周期挂钩,每次在组件上运行更改检测时都会调用它。

另见 https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#docheck

但是请注意,仅仅因为调用了该方法并不一定意味着已经检查了模板绑定的更改。我相信(我可能是错的,这是我记忆中的,当我前一段时间玩一个 plunker 时)即使第一个 OnPush 组件没有被标记, ngDoCheck() 仍然被调用,但我不' 认为模板绑定已检查。此外,如果 OnPush 组件未标记为检查,则不会在后代组件上调用 ngDoCheck()