- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个 Angular 2 站点,其中有一个 websocket 将数据从后端泵入我们的网格。为了指示最近的更新,我们使用 CSS 设置行的背景颜色和受影响的单元格上的粗体。
指示应该只持续很短的时间。
1) 我们的第一次尝试是在下一批从服务器到达时重置所有指标。这运行良好,但在某些 View 中很少有更新,这意味着指标可以保持很长时间,这有点令人困惑。
如果更新指示器在固定时间间隔(例如 4 秒)后消失会更加一致。
2) 我们的下一个尝试是使用 CSS 动画。但是过了一会儿,它就滞后了很多。给人的印象是运行过多的动画会使浏览器过载,无法处理请求的时间。也许每个动画在后台都有自己的计时器?
3) 第三种尝试是让一个计时器以固定的时间间隔运行,然后检查要重置哪些记录。我们创建了一个 TimerService,它将定期检查到期元素。将元素添加到计时器池时,可以配置任意等待时间。
这行得通,但是在日志窗口中经常出现违规警告:
[Violation] 'setInterval' handler took 56ms
[Violation] 'setInterval' handler took 74ms
[Violation] 'setInterval' handler took 63ms
[Violation] 'setInterval' handler took 88ms
...
但是当我们对 checkItems 方法内部发生的事情进行计时时,它只需要 0.03 毫秒!
我们都有 C# 背景并且刚刚使用 Angular 几个月。也许我们正在实现后端方法?
是否发生了我们错过的上下文切换?
有没有更前端友好的替代方法?
我们可以对我们的代码进行一些重要的优化吗?
感谢所有建议!
这是导致所有警告的建议 TimerService:
import { Injectable, OnInit } from "@angular/core";
import { Observable } from "rxjs/Rx";
import { Subject } from "rxjs/Subject";
@Injectable()
export class TimerService {
private timerItems: TimerItem[] = [];
private dueTimeReachedSubject: Subject<string> = new Subject<string>();
public dueTimeReached: Observable<string> = this.dueTimeReachedSubject.asObservable();
constructor() {
setInterval(() => this.checkItems(), 1000);
}
private checkItems() {
let now = Date.now();
let removeKeys: string[] = [];
this.timerItems.filter(t => t.dueTime <= now).forEach(t => {
this.dueTimeReachedSubject.next(t.key);
removeKeys.push(t.key);
});
this.timerItems = this.timerItems.filter(t => removeKeys.indexOf(t.key) < 0);
}
public add(key: string, delayInSeconds: number) {
let dueTime = Date.now() + delayInSeconds * 1000;
let timerItem = this.timerItems.find(t => t.key === key);
if (timerItem) {
timerItem.dueTime = dueTime;
}
else {
this.timerItems.push(new TimerItem(key, dueTime));
}
}
public remove(key: string) {
this.timerItems = this.timerItems.filter(t => t.key !== key);
}
}
class TimerItem {
constructor(public key: string, public dueTime: number) { }
}
编辑
我尝试使用 Observable.interval: Same result with exactly the same warning message: "[Violation] 'setInterval' handler take xx ms"
我尝试将 setTimeout 用于重复调用:相同的结果,但修改了警告消息:“[Violation] 'setTimeout' 处理程序占用了 xx 毫秒”
我什至尝试清空每一行的 checkItems,但我仍然收到警告。
警告是从 zone.js 内部抛出的,似乎是 Angular 内部推荐。我知道我可以在 Chrome 开发者工具中关闭详细日志记录,但我经常将 console.debug 用于开发目的,这意味着它们也会消失。
我猜对于慢速函数来说警告是可以的,但在这种情况下它只是触发一个 setInterval 函数。为什么会这么慢?
最佳答案
在这样的站点中可以做很多事情。
第一个是将 ChangeDetectionStrategy 更改为 ChangeDetectionStrategy.onPush ,然后仅在需要时激活检测,在您的情况下,在 checkItems 的末尾添加和删除.这将大大减少脚本编写,因为只有在被询问时,angular 才需要评估您的 html
你可以做的第二件事是检查你的寺庙是否有一个函数调用在 *ngIf或 *ngFor,如果你这样做,angular 将无法缓存此函数返回的值,并且必须为每次检查处理它们
您应该考虑的第三件事是优化 checkItems,在 O(n^2) 中运行 checkItems 并执行许多不必要的循环。你可以减少它
checkItems() {
this.timerItems = this.timerItems.filter(t => {
if(t.dueTime <= now){
this.dueTimeReachedSubject.next(t.key);
return false;
}
return true;
});
}
对于小型阵列,它不会有太大帮助,但越大,这个变化就会开始生效..
我想还有更多事情可以做,但这 3 件事帮助我解决了类似的性能问题
关于javascript - 在 Angular 2 中应用频繁 CSS 更改的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043151/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!