我有一个组件显示一个包含4行的简单表 . 然而,当它加载时的性能很糟糕 - 我得到0.5秒的延迟 . 有关它的几个事实:

  • 使用空表渲染组件,然后约0.5秒,然后使用实际数据重新渲染组件 . 在0.5秒期间没有任何事情发生(没有CPU,渲染等 - 至少根据Chrome分析器)

  • 之后0.5秒钟,callstack开始计时器被激活..

  • 数据是从服务加载的,不涉及网络调用 - 我只想显示应用程序中先前流程的数据,以确认用户

  • 我尝试在组件构造函数,字段初始值设定项以及ngOnInit中加载数据 - 同样的事情发生了

  • 我在应用程序的各处都使用OnPush变化检测策略,即使我删除了OnPush - 模式相同,只是时间是0.3秒而不是0.5秒

基于上面我假设首先组件被渲染,然后在0.5之后,第二个更改检测周期触发并且组件通过更新重新呈现 .

最大的问题是:为什么Angular需要重新渲染而不是首先正确渲染组件?如果我在构造函数中获取数据 - 不应该初始更改检测已经将其提取出来吗?

@Component({
  //irrelevant part
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class AbcScanConfirmationComponent {

  document: Document = this.clientLastScanDataService.getDataForCurrentClient();

  client: Client = this.clientContextService.currentClient;

  constructor(private clientContextService: ClientContextService,
              private clientLastScanDataService: ClientLastScanDataService) {

  }
}