我能够在 IE 中重现这种滞后。
我重构了您的代码以提高性能。如果您正在处理大型数据集并渲染大型列表,除了trackBy,您还应该考虑使用ChangeDetectionStrategy.OnPush 作为您的changeDetectionStrategy。
重构后的代码如下所示:
import { Component, ChangeDetectionStrategy } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Component({
selector: 'app-comments',
templateUrl: './comments.component.html',
styleUrls: ['./comments.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CommentsComponent {
comments$: Observable<Array<any>> = this.http.get(`https://jsonplaceholder.typicode.com/comments`);
constructor(private readonly http: HttpClient) { }
trackyFn(item) {
return item.id;
}
}
模板:
<h1>Comments</h1>
<div class="row">
<div class="col-md-12" style="height: 250px; overflow:scroll">
<table class="table table-hover">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Email</th>
<th>Body</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let comment of comments$ | async; trackBy:trackyFn;">
<td>{{comment.id}}</td>
<td>{{comment.name}}</td>
<td>{{comment.email}}</td>
<td>{{comment.Body}}</td>
</tr>
</tbody>
</table>
</div>
</div>
同样,您可以重构PostsComponent。
还有你的 AppComponent:
import { Component, ChangeDetectionStrategy } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent {
name = 'Angular';
registerForm: FormGroup;
constructor(private readonly formBuilder: FormBuilder) { }
ngOnInit() {
this.registerForm = this.formBuilder.group({
firstName: ['', Validators.required],
lastName: ['', Validators.required],
termsAgreed: [false],
gender: ['male'],
std: [10]
});
}
}
我所做的更改:
- 在所有组件中使用了
changeDetection: ChangeDetectionStrategy.OnPush,。 - 随着 Angular 执行更少的 CD 周期,提高性能的主要因素。
- 在模板中使用
async,而不是分别从Observable 和Subscription 手动使用subscribeing 和unsubscribeing。 - 只是为了让代码更简洁。
如果您是 Windows 用户,要查看性能是否得到改进,请在文本表单字段中按住键盘上的任意键,然后查看输入是否能顺利反映。
这里有一个Working Sample StackBlitz 供您参考。