Angular 角度区域中的呼叫检测更改

Angular 角度区域中的呼叫检测更改,angular,Angular,当在角度区域外工作时,有两种方法可以检测更改-使用NgZone.run或ChangeDetectorRef.detectChanges方法重新输入区域。NgZone.run方法执行应用程序勾选,这可能会导致性能问题,因为它会重新检查整个应用程序。调用detectChanges仅更新我所需要的组件视图,但是如果组件正在呈现一些它无法控制的内容,并且这些内容取决于在角度区域中进行初始化,那么它将停止工作。我创建了一个示例来演示该案例: 单击按钮最初会更新视图。调整窗口大小后,按钮不再更新视图,因为

当在角度区域外工作时,有两种方法可以检测更改-使用NgZone.run或ChangeDetectorRef.detectChanges方法重新输入区域。NgZone.run方法执行应用程序勾选,这可能会导致性能问题,因为它会重新检查整个应用程序。调用detectChanges仅更新我所需要的组件视图,但是如果组件正在呈现一些它无法控制的内容,并且这些内容取决于在角度区域中进行初始化,那么它将停止工作。我创建了一个示例来演示该案例:

单击按钮最初会更新视图。调整窗口大小后,按钮不再更新视图,因为单击处理程序未绑定在角度区域中,并且不会触发更改检测

我的问题是-是否有一种方法仅检测组件视图中的更改并初始化角度区域中的内容。换句话说,指定当前区域为角度区域,而不触发应用程序勾选。

多种解决方案

第一个是使用事件管理器:

第二个是
HostListener
装饰器:

第三个也是最后一个是全局目标上的模板绑定:

模板:`

你的例子很好地说明了这个问题,但是你能准确地解释一下你想要实现什么吗?因为如果是这样的话,我可以告诉你,这不是你如何在角度上绑定一个事件。。。也许有了你的目标,我们就可以给你解决这个问题的办法了!我的目标是仅在组件视图中检测更改,并单击按钮触发更改检测。如果不想在每次触发事件时对整个应用程序运行更改检测,则必须以这种方式绑定事件。对于更复杂的应用程序来说,在性能方面可能会非常昂贵。你说的不是真的,我提供了一个答案,告诉你如何做(因为你花了时间来响应)。请随便看看。谢谢你的建议。不幸的是,每次触发调整大小事件时,所有建议的解决方案都会触发应用程序范围的检查。如果向AppComponent添加ngAfterViewChecked钩子,这看起来很简单:Angular就是这样工作的。打样(单击按钮更改值)。
this.manager.addGlobalEventListener('window', 'resize', this.setCurrent.bind(this));
@HostListener('window:resize', ['$event']) private setCurrent(): void {
template: ` <span [style.display]="'none'" (window:resize)="setCurrent()"></span>