【问题标题】:Angular - how do I get data to load with ngOnChangesAngular - 如何使用 ngOnChanges 加载数据
【发布时间】:2019-12-23 09:30:38
【问题描述】:

我有一个demo here

这是一个角度应用程序,我正在尝试创建 D3 图表。

图表数据是使用 createDate 函数创建的,创建随机数据和日期。

我希望使用更新按钮更新图表,因此我使用 ngOnChanges 但这不会在页面加载时创建图表。

注释掉的 ngOnInit 在页面加载时加载图表。

ngOnChanges(changes: SimpleChanges) {
    if(!changes.data) return;

    if(this.hasPreviousData){

      this.createData()

      this.stack = d3.stack()
          .keys(['data_1', 'data_2', 'data_3', 'data_4'])

      this.createStack(this.testData);
    }else{

      this.createData()

      this.stack = d3.stack()
        .keys(['data_1', 'data_2', 'data_3', 'data_4'])

      this.initScales();
      this.initSvg();
      this.drawAxis();
      this.createStack(this.testData);

      this.hasPreviousData = true;
    }
  }

【问题讨论】:

  • 我没有看到在附加的 stacklitz 示例中绘制任何图表。你能验证一下吗
  • 这是我的问题,如果您注释掉 ngOnChanges 并取消注释 ngOnInit,您将看到图表,但我希望它与 ngOnChanges 一起使用
  • 好问题。查看我的回答,如果有帮助,请告诉我。

标签: angular typescript d3.js angular-changedetection ngonchanges


【解决方案1】:

ngOnChanges 不起作用的原因是它适用于 @Input 参数更改。在您的情况下,您只是从组件本身更改组件的值。

Take a look at this demo。我在您的演示代码中进行了一些代码更改,它似乎在做您所期望的相同的事情。

您可以将图形创建逻辑放在createData() 本身并处理其余部分:

  createData() {
    this.testData = [];
    this.years = Math.floor(Math.random() * this.dates.length)
    console.log(this.years)
    for(let i:number= 0; i<=this.years; i++){
      this.testData[i] = {
        data_1: Math.floor(Math.random() * (this.max - this.min)),
        data_2: Math.floor(Math.random() * (this.max - this.min)),
        data_3: Math.floor(Math.random() * (this.max - this.min)),
        data_4: Math.floor(Math.random() * (this.max - this.min)),
        date: this.dates[i]
      }
    }    
    this.stack = d3.stack()
      .keys(['data_1', 'data_2', 'data_3', 'data_4']);
    if(this.hasPreviousData){
      this.createStack(this.testData);
    }else{
      this.hasPreviousData = true;
      this.initScales();
      this.initSvg();
      this.drawAxis();
      this.createStack(this.testData);
    }
  }

【讨论】:

  • @Enthu:当然。让我检查一下
  • @ShashankVivek 我在这里有类似的问题stackoverflow.com/questions/57666947/… ngOnChanges 不允许获取页面/组件加载上的数据,请您帮忙。
猜你喜欢
  • 2017-03-29
  • 2019-03-01
  • 2018-06-21
  • 1970-01-01
  • 2018-07-17
  • 2021-03-27
  • 2017-09-28
  • 2023-02-22
  • 2020-07-30
相关资源
最近更新 更多