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

时间:2018-01-15 13:48:11

标签: angular typescript onchange lifecycle

我有一个包含复杂输入(一些图表数据)的子组件。 在获得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仅指示在组件使用未定义的值初始化时触发一次。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您必须使用changeDetectorRef

this.cd.markForCheck();
if (!this.cd['destroyed']) {
    this.cd.detectChanges();
}