当前位置: 首页 > 知识库问答 >
问题:

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

闻枫
2023-03-14

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

子图表组件:

js prettyprint-override">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个答案

归建安
2023-03-14

您必须使用change eDetectorRef

this.cd.markForCheck();
if (!this.cd['destroyed']) {
    this.cd.detectChanges();
}
陆英毅
2023-03-14

多亏了@HoangDucNguyen,以下是工作代码:

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

当然,您需要从@angular/核心导入更改检测器Ref类,并将其注入到构造函数中。

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

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

 类似资料:
  • 我的效果在出错时,调用服务中的方法来显示对话。当对话完成时,它会将结果放入可观察的。 我有一个组件正在监听该服务中的可观察内容。问题是,组件第一次侦听服务,然后什么也听不到。 我正在设置该主题以避免收到错误消息,即第一次this.errorService.errorExist$没有返回任何内容。 错误服务 成分

  • 我的组件具有以下功能: 我可以在我的html页面中插入选择菜单,但更改事件不会在我选择项目时触发。有人能让我知道为什么会发生这种情况吗? 谢谢

  • 编辑:我已经采取了一种不同的方法来解决这个问题:根据接受的答案,在上检索父组件中的动态子组件值。 我正在尝试让父组件发出一个Event/Observable,以便它的子动态组件在侦听这样的事件时触发一个动作。 我已经了解到,在动态组件中使用或修饰符是不可能的,所以... 这是我用例的大纲: 动态子组件由一组4个输入元素组成。(完成) 父组件具有按钮,用于添加动态子组件。此按钮可用于添加动态子组件的

  • 问题内容: 我正在尝试模拟Firefox和iTunes菜单栏的行为。行为:菜单栏最初是隐藏的。但是,当您按时,会出现菜单栏(选择了第一项),而当您没有选择菜单项时,菜单栏会消失。我的想法是侦听选择更改通过其。 但是,附加的SSCCE的行为不是所希望的。框架加载后,看不到。当您按时,菜单栏出现,并选择了第一个菜单(由于)。但是,随后的所有按下均不会触发。我不知道为什么… 有人要散发出光吗? 问题答案

  • 问题内容: 我在ui网格的columDefs中使用headerCellTemplate(不是ng- grid,而是新的重写)。在html中,我有一个复选框。本质上,我试图在作为所有复选框的列的标题中添加一个复选框,以便可以检查所有/无。带有复选框的单元格可以正常显示。问题在于标题中复选框中的ng- change永远不会触发该事件。另外,ng- model值永远不会改变。查看代码,有一个名为uiGr

  • 我在Android应用程序中遇到了Firebase实时数据库的问题。 我正在尝试的是实时更新列表。但更新只适用于应用程序启动。它不会自动更新。所以,我需要重新启动的应用程序,每当想要更新。 有缺少的部分吗?谢谢你的帮助。谢谢 问题:监听器仅在应用程序重启时触发了方法。数据正确。但是监听器在那之后就不起作用了。 代码: