使用滚动事件时出现 ExpressionChangedAfterItHasBeenCheckedError

ExpressionChangedAfterItHasBeenCheckedError when using scroll event

在我的网站中,当用户在页面中滚动时徽标会旋转。

代码非常基础:

组件

@HostListener('window:scroll', ['$event'])
scrollPos(){
  if (typeof window !== 'undefined') {
    return Math.round(window.scrollY);
  }
}

HTML

<img src="assets/logo.svg" [ngStyle]="{ transform: 'rotate(' + scrollPos() + 'deg)' }" />

但是,有时这个基本代码在网站中导航时会产生这个错误:(

 ERROR Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it 
 was checked. Previous value: 'rotate(397deg)'. Current value: 'rotate(331deg)'.

如何更新我的上述代码以避免出现此错误?

感谢您的支持

你通常应该避免从 @HostListeners 返回东西,因为......除了他们监听的事件之外,他们不应该被任何东西调用;

相反,将 window.scrollY 分配给组件中的 属性 并从组件访问它;

public wScrollY: number = 0;

@HostListener('window:scroll', ['$event'])
scrollPos(){
  if (typeof window !== 'undefined') {
    this.wScrollY = Math.round(window.scrollY);
  }
}

模板

<img src="assets/logo.svg" [ngStyle]="{ transform: 'rotate(' + wScrollY + 'deg)' }" />