javascript - Angular2 setinterval 在 dom 更改时被阻止

标签 javascript angular performance dom setinterval

我有一个基本的 Javascript/JQuery 应用程序,现在我正在将其迁移到 Angular2,并使用 Material.angular.io 作为我的 UI。

在旧版本中,当我使用“setInterval(func,200);”时要每 200 毫秒查询一次服务器,它就会每 200 毫秒调用一次,即使使用 JQuery 的append(content) 或 html(content) 函数添加 DOM 元素也是如此。

现在在 Angular2 中,虽然 DOM 使用 *ngFor 进行更改并且更改很大(从服务器获取约 200 行并将它们显示为具有切换按钮等 Material 组件的表行),但所有内容都会卡住大约 1 秒。服务器日志显示,调用确实停止了大约 1 秒,然后每 200 毫秒再次恢复一次。 但是当我以较小的组添加 DOM 元素时(即每 200 毫秒 10 个项目),那么一切都很好。

当我使用 F11 切换全屏时,当浏览器重新绘制布局以匹配新的窗口大小时,也会发生这种情况。

使用 Chrome 的调试控制台,我可以看到“Timer Fired(zone.js:2087)”显示为“Recurring handler take 731.18 ms”警告。我不确定问题是因为我的代码还是因为material.io问题,但我认为Angular的setInterval与普通的JavaScript setInterval不同?

相关代码如下:

<tbody>
  <tr *ngFor="let io of inputs; trackBy: trackByFn">
    <td>{{io.id}}</td>
    <td>{{io.name}}</td>
    <td>{{io.description}}</td>
    <td><mat-slide-toggle>Test</mat-slide-toggle></td>
    <td>{{io.device}}</td>
  </tr>
</tbody>

debug

来自服务器的日志显示上次查询的时间:

15:40:25.229 stat.service.ts:108 200
15:40:25.430 stat.service.ts:108 201
15:40:25.630 stat.service.ts:108 201
15:40:25.831 stat.service.ts:108 201
15:40:26.031 stat.service.ts:108 200
15:40:26.235 stat.service.ts:108 203
15:40:26.435 stat.service.ts:108 201
15:40:26.636 stat.service.ts:108 201
15:40:26.838 stat.service.ts:108 202
15:40:27.039 stat.service.ts:108 201
15:40:27.895 stat.service.ts:108 856 // WHEN THE COMPONENT LOADS
15:40:28.200 stat.service.ts:108 305
15:40:28.442 stat.service.ts:108 242
15:40:28.679 stat.service.ts:108 237
15:40:28.901 stat.service.ts:108 221
15:40:29.131 stat.service.ts:108 231
15:40:29.363 stat.service.ts:108 231

最佳答案

也许这就是 Angular 中 ChangeDetection 的问题。当您更改对象时,它会渲染整个对象。尝试在您的组件中实现 ChangeDetectionStrategy 并查看是否有任何改进。您的组件代码将如下所示:

@Component({
  selector: "your-comp",
  templateUrl: "./your.component.html",
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class YourComponent{
  constructor(private cdr: ChangeDetectorRef) {}

 // this.cdr.markForCheck(); use code for change on DOM when you get data in observable
}

希望对你有帮助

关于javascript - Angular2 setinterval 在 dom 更改时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48169563/

相关文章:

javascript - 下划线模板不会加载 Model.id,在打印 <% console.log(Model.id) %> 时它显示为未定义

JavaScript Math.sqrt 性能

javascript - 显示 <li> 中 2 个数组的元素

c++ - 如何从子进程获取统计信息以衡量资源利用率?

android - 使videoview中的视频加载速度更快

Java - 多行正则表达式大字符串性能不佳

javascript - jQuery 创建回调

angular - 在索引 0 处初始化没有空输入的表单数组

javascript - 如何使用来自 Angular 组件的发布请求打开新选项卡

html - 删除 Angular 2/Ionic 2 中自动注入(inject)的 CSS 样式