javascript - 方法每 10 秒触发一次并在 app.component.html 文件中重复运行
问题描述
我有一个 Angular 9 应用程序(最近从 7 升级,但在 7 中仍然有同样的问题),在我的 app.component.html 文件中我有下面的代码。页面加载正确,一切看起来都很好。但是方法
getSideBarState() // 返回一个布尔值
在我第一次启动调试器时,'toggled' 和 'show' ngClass 都会被触发并运行至少 10 次以上。然后在最后一个运行后,它等待约 10 秒,然后再次触发约 10 秒并运行。这会一直持续下去,无休止地被触发和运行。
谁能告诉我为什么,以及如何阻止它被触发并运行这么多次?我只希望它在应用程序首次加载时运行一次。
<div class="page-wrapper" [ngClass]="{'toggled' : getSideBarState()}" (window:resize)="onResize()">
<app-sidebar></app-sidebar>
<main class="page-content">
<div class="">
<app-nav-bar></app-nav-bar>
<router-outlet (activate)="onActivate($event)"></router-outlet>
</div>
<div class="overlay" (click)="toggleSidebar()" [ngClass]="{'show' : !getSideBarState()}"></div>
</main>
</div>
解决方案
这是按照 Angular 的设计工作的。
getSideBarState
每次更改检测在 Angular 应用程序中运行时都会被调用,几乎在每个生命周期钩子上以及更多次(目前我不知道),因为您在模板中使用函数(返回模板的内容)而不是简单的变量绑定。
你如何避免这种情况?
为了避免调用你getSideBarState
的函数ngOnInit
或其他合适的生命周期钩子并将返回值分配给一个变量,然后绑定到模板中的那个变量,这样它就不会运行多次。
例如 -
ngOnInit() {
getSideBarState();
}
getSideBarState() {
... Some calculations (here `classState` is variable)
classState = true/false; // return value
}
<div class="page-wrapper" [ngClass]="{'toggled' : classState}" (window:resize)="onResize()">
<app-sidebar></app-sidebar>
<main class="page-content">
<div class="">
<app-nav-bar></app-nav-bar>
<router-outlet (activate)="onActivate($event)"></router-outlet>
</div>
<div class="overlay" (click)="toggleSidebar()" [ngClass]="{'show' :!classState}"></div>
</main>
</div>
希望这个答案对您有所帮助。
推荐阅读
- ruby-on-rails - Rails 5.2 & Bootsnap:使用 app/lib 文件时出现 NameError
- javascript - 在d3.js圆圈内填充图像?
- spring - Spring Security中的UsernamePasswordAuthenticationFilter没有被调用
- java - 注释是否适用于声明语句中的所有变量?
- docker - 退出代码 127 和“:没有这样的文件或目录”
- fortran - 如何在 f2py 中构建 .so 文件而不会出错?
- javascript - GraphQL:覆盖 slug
- gis - netlogo:如何对自己的属性进行分组
- php - Laravel:使用 cookie 仅显示一次模态
- javascript - 无法在reactjs中添加json