javascript - 如何防止滚动变化检测? ( Angular )

标签 javascript angular

我有一个大型组件,我希望避免不必要的更改检测以提高性能。

我将 changeDetection: ChangeDetectionStrategy.OnPush 添加到 @Component

我想更新滚动元素的样式。不幸的是,每次我滚动该元素时,Angular 都会运行更改检测。

我尝试向 native 元素添加事件监听器以避免这种情况,但当我滚动时更改检测仍在再次运行:

@ViewChild('my_element') my_element_ref: ElementRef;

ngOnInit() {
    this.my_element_ref.nativeElement.addEventListener('scroll', this.updateStyle);
}

ngAfterViewChecked() {
    console.log('check');
}

即使 this.updateStyle 是空函数,ngAfterViewChecked 也会被调用。 但是,如果我注释掉 this.my_element_ref.nativeElement.addEventListener('scroll', this.onScroll),则不再调用 ngAfterViewChecked

如何在元素滚动时调用函数,但避免 Angular 的更改检测?

最佳答案

我建议你使用 ngZone.runOutsideAngular。

constructor (private zone : NgZone) {}
ngAfterViewInit () : any {
    this.zone.runOutsideAngular(() => {
      window.addEventListener('scroll', (e)=> {
        console.log( 'scroll event fired' );
      });
    });
  }

关于javascript - 如何防止滚动变化检测? ( Angular ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56339104/

相关文章:

javascript - CSS |固定位置不适用于 IE11

Angular 2 : check if shift key is down when an element is clicked

javascript - 有没有办法在 Angular 项目中通过智能感知从库中显示函数注释?

angular - 如何显示 SafeUrl 或 SafeResourceUrl?

angular - Nginx:带有 Web 组件的 Angular 应用程序 - 脚本类型 ="module"错误

javascript - 带有样式的 IE 新元素?

javascript - 在 Javascript/AngularJS 中获取 HashMap 的键和值

javascript - JSON 字符串在 post 请求期间发生更改

angular - 如何从应用程序模块中导入的模块访问组件?

javascript - 重用 json 数据在另一个 html 页面上显示 "detail" View