我认为这是一个错误,但是我先在这里问一下,以防万一。
我有这个模板的组件:
<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
之外非自愿地执行了此特定操作...