我认为这是一个错误,但是我先在这里问一下,以防万一。

我有这个模板的组件:

 <app-graph-grouped-vertical
      [results]="graphRecords"
      [series]="graphPredictions"
      [seriesColors]="predictionColors"
      [xAxis]="xAxis"
></app-graph-grouped-vertical>


在GraphGroupedVerticalComponent内,我得到了:

export class GraphGroupedVerticalComponent extends GraphBaseComponent<GroupedResultDto>
  implements OnChanges, OnInit, OnDestroy, DoCheck {
...
 @Input() results!: GroupedResultDto[]

 ngOnChanges(changes: SimpleChanges){console.log('Triggered')}
...

}


因此,当我从计算机进入浏览器并且父组件中的属性graphRecords更改时,一切工作正常,并且子级中的ngOnChanges被触发。问题是,当我通过移动浏览器或已编译的本机应用程序使用该应用程序时,它不会触发。为了触发它,更改records后,我必须在屏幕上按任何东西(不是空格,而是一个交互式元素。它不必与组件或该属性相关)。

它发生在物理电话以及模拟器,Android和iOS中。

我什至尝试使用ngDoCheck,但也不会触发。我有点绝望,有人知道会发生什么吗?

我正在使用Ionic 4和Angular 8

最佳答案

好吧,我花了一段时间才弄清楚发生了什么。事实证明,将新值分配给records的操作发生在ngZone之外。对于任何对此不熟悉的人,区域就像是一个在其中运行进程的封闭环境,而ngZone是Angular运行异步操作的地方,并将相应地更改UI。

这也相反。如果在ngZone之外执行了某些操作,则Angular的ChangeDetection将不会监听它,并且我们的UI不会更改。幸运的是,您可以使用ngZone强制某些内容在ngZone.run()内部运行。而且,您还可以在其外部运行繁重的操作,因此Angular不会不必要地刷新UI,从而优化了您的应用程序。

但是,我仍然不知道为什么在ngZone之外非自愿地执行了此特定操作...

09-28 11:05