Angular 5 ngOnChanges仅在子组件中触发一次

问题描述 投票:2回答:2

我有一个包含复杂输入(一些图表数据)的子组件。在获得API响应后,我通过Angular 5中的@Input()装饰器从父组件发送此图表数据。因此,每次在父组件上更改时,我都需要根据API响应同步图表,因此,OnChange Lifecyle。但不幸的是,我无法使其正常工作。我尝试设置一个具有基本数字类型的虚拟输入字段并增加它但是徒劳无功。这是我的实现:

儿童图表组件:

export class ChartComponent implements OnInit, OnChanges {

  @Input() chartData;
  @Input() triggerChart;

  ngOnChanges(changes: SimpleChanges) {
    console.log(changes);
  }

}

父组件html:

<app-chart [chartData]="chartData" [triggerChart]="triggerChartData"></app-chart>
<input [(ngModel)]="triggerChartData" type="hidden">

父组件:

this.chartService.getChartData(params).subscribe(res => {
  this.chartData = res;
  this.triggerChartData++;
});

PS:作为标题的ngOnChanges仅指示在组件使用未定义值初始化时触发一次。

angular typescript onchange lifecycle
2个回答
6
投票

感谢@HoangDucNguyen,这是工作代码:

this.chartService.getChartData(params).subscribe(res => {
  this.chartData = res;
  this.changeDetectorRef.detectChanges();
});

当然,您需要从@ angular / core导入ChangeDetectorRef类并将其注入构造函数中。

说明: 当变量在角度上下文之外更改时(在此处:它是rxJs上下文),Angular无法检测变量的变化。因此,您需要手动触发检测更改角度方法。

官方文件:https://angular.io/api/core/ChangeDetectorRef


0
投票

你必须使用changeDetectorRef

this.cd.markForCheck();
if (!this.cd['destroyed']) {
    this.cd.detectChanges();
}
© www.soinside.com 2019 - 2024. All rights reserved.