在角度区域之外工作时,有两种方法可以检测到变化-通过 NgZone.run 或 ChangeDetectorRef.detectChanges 方法重新进入该区域。 NgZone.run 方法执行应用程序滴答,这可能会导致性能问题,因为它会重新检查整个应用程序。调用 detectChanges 只会更新我需要的组件视图,但是如果该组件正在呈现一些它无法控制的内容并且依赖于在角度区域中进行初始化,则它将停止工作。我创建了一个示例来说明这种情况: https://stackblitz.com/edit/angular-zv5mf1?file=src/app/resize.component.ts
单击按钮最初将更新视图。调整窗口大小后,该按钮不再更新视图,因为单击处理程序未绑定在角度区域中,并且不会触发更改检测。
我的问题是-有没有办法仅在组件视图中检测更改并初始化角度区域中的内容。换句话说,指定当前区域为角度区域,而不会触发应用程序滴答声。
答案 0 :(得分:0)
几种解决方案。
第一个是使用事件管理器:stackblitz
this.manager.addGlobalEventListener('window', 'resize', this.setCurrent.bind(this));
第二个是HostListener
装饰器:stackblitz
@HostListener('window:resize', ['$event']) private setCurrent(): void {
第三个也是最后一个是在全局目标上绑定模板:stackblitz
template: ` <span [style.display]="'none'" (window:resize)="setCurrent()"></span>