【问题标题】:Highcharts instance created in which Angular life cycle hookHighcharts 实例在其中创建 Angular 生命周期钩子
【发布时间】:2020-09-20 05:25:04
【问题描述】:

我目前正在使用带有 Highcharts API 的 Angular 7+。

我使用以下 Official Github Link 集成了 Highcharts。

Highcharts 中有一个callbackFunction,我们可以使用它来获取图表实例。 但是,我还没有弄清楚两件事:

  1. chart 的实际实例 何时与options 一起创建,例如Angular 中的哪个生命周期挂钩?还是它独立于生命周期钩子。
  2. 我看到了一个开发者的例子,他在 ngOnInit 生命周期钩子中使用了 callbackFunction 并且它起作用了(即我们从打回来 )。但是,对于 ngOnChanges 钩子,同样的方法不起作用。

    所以我的意思是,假设有一个与 graph data 相关的 @Input 属性将由 Highcharts.chart 呈现(比如附加一个新系列),那么我将不得不使用 ngOnChanges 方法为了检测输入属性的变化,ngOnChanges 将在 ngOnInit 之前按照this 调用。那么我将如何获得图表实例?那么我将如何做一个 addSeries 呢?

  3. 为什么 addSeries 仅在 button click 上有效,而在 ngOnInit 中无效?取消注释hello.component.ts 内的第 59 行以查看它。

Link to the code.

详情请见hello.component.ts

【问题讨论】:

  • 你应该分享你试过的代码
  • 完成。看看并告诉是否还需要什么?
  • 您想从 appcomponent 发送并在 hellocomponent 中自动更改吗?
  • 是的,我希望与单击按钮时发生的现象相同,第 59 行未注释。即添加更多系列。
  • hello.component.ts 持有图表,对吗?如果是这种情况,我建议该组件的 ngOnInit() 函数将引导您访问其子组件,例如购物车及其属性。这就是你不确定的原因。并且在 ngOnInit 钩子之前调用了 ngOnChanges() 钩子。请阅读(尤其是第二个蓝框:angular.io/guide/…

标签: angular highcharts


【解决方案1】:

根据@pc_coder 给出的解释,我删除了 ngOnInit,并在 ngOnChanges 内部实现了 addSeries 并且它起作用了.

export class HelloComponent implements OnChanges {
  @Input() name: string;
  @Input() newData: any;
  title = 'AngularTest';
  chartCreated;


  Highcharts: typeof Highcharts = Highcharts;
  chartCallback: Highcharts.ChartCallbackFunction;
  updateFlag: boolean = false;
  clicked:boolean = false;

  chartOptions: Highcharts.Options = {
    series: [{
      data: [1, 2, 3],
      type: 'line'
    }]
  };

  // ngOnInit(){
  //   console.log('Inside ngOnInit');
  //   this.chartCallback = (chart) => {
  //               this.chartCreated = chart;
  //               console.log('chart: ' + chart); // shows object
  //           }
  //  
  // }

  ngOnChanges(){
    console.log('Inside ngOnchanges');
    this.chartCallback = (chart) => {                  
                this.chartCreated = chart;
                console.log('chart: ' + chart);
                this.chartCreated.addSeries(this.newData); // This worked :)
            }

  }


  onClick(){
    if(this.clicked==false){
      this.chartCreated.series[0].data[0].update(4);
      this.clicked = true;
    //this.chartCreated.addSeries(this.newData); // works on uncommenting  
    }
    else{
      this.chartCreated.series[0].data[0].update(1);
      this.clicked = false;
    }
  }
}

它支持他的观点:“回调是异步的,不依赖于 OnInit/OnChanges”,并且“图表实例是在设置选项后创建的 ”。

【讨论】:

  • 并在初始加载完成后触发回调。这意味着当您添加内部回调时。这意味着图表已准备好向其添加系列。
  • 嘿@pc_coder,谢谢。它确实有很大帮助。你能不能也支持我的问题:)。这样它就可以覆盖更多的人。
【解决方案2】:

Demo 在这里你只需要更新chartoptions 如果你想更新数据

ngOnChanges(){
    console.log(this.newData); 
    this.chartOptions.series[0]=this.newData;      
  }

如果你想添加新系列

ngOnChanges(){
    console.log('Inside ngOnchanges');
    this.chartOptions.series.push(this.newData)   
  }
  1. 设置Highchart的图表选项后创建Highchart

  2. 您可以定义回调 ngOnchange 或 ngOnInit。在这两者中它都有效。但是您错过了your this.chartCreated.addSeries(this.newData) 在那里不起作用,因为它是异步函数,因此在回调之外您可能无法定义chartCreated。如果将此代码放入回调函数中,您将看到它将添加新系列。您使用图表选项创建的第一个系列。

  3. 它适用于 onclick,因为在点击之前,您的回调已经定义了您的 chartCreated 这就是点击有效的原因。

作为final你不需要创建额外的变量,你可以使用chartoptions来更新或添加新的系列。

【讨论】:

  • 感谢您的回复。但是您能否也请简要回答我提出的 3 个问题?也没有办法使用 addSeries 吗?
  • 我用你的问题更新了答案@KL_KISNE_DEKHA_HAI
  • 感谢您的回复。我可以说图表回调和 addSeries 都与您的结论不同步吗?
  • 回调是异步的
  • 好的,感谢您的澄清。我发布了一段代码来支持你的解释。看一看。 :)
猜你喜欢
  • 2017-11-22
  • 2018-08-30
  • 2017-11-13
  • 2018-01-11
  • 2019-06-26
  • 2018-05-28
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多