0

I am building an Angular app where I am using google charts. Faced some issue which seems to be related to async

My HTML code is:

<i class='bx bx-line-chart chart-icon' (click)="changeGraph('line')"></i>
<i class='bx bx-pie-chart chart-icon' (click)="changeGraph('pie')"></i>
<i class='bx bx-bar-chart chart-icon' (click)="changeGraph('bar')"></i>

<ng-container *ngIf="lineChart">
    <div id="curve_chart"></div>
</ng-container>

<ng-container *ngIf="pieChart">
    <div id="piechart"></div>
</ng-container>

<ng-container *ngIf="barChart">
    <div id="columnchart_material"></div>
</ng-container>

In component.ts the changeGraph() method is:

changeGraph(chart: string) {

    this.pieChart = chart === 'pie';
    this.lineChart = chart === 'line';
    this.barChart = chart === 'bar';


    google.charts.load('current', {'packages':['corechart', 'bar']});
    google.charts.setOnLoadCallback(() => {
      if(this.pieChart) {
        drawPieChart();
      } else if (this.barChart) {
        drawBarChart();
      } else {
        drawLineChart();
      }
    });
    

    function drawPieChart () {
      var data = google.visualization.arrayToDataTable([
        ['Task', 'Hours per Day'],
        ['Work',     11],
        ['Eat',      2],
        ['Commute',  2],
        ['Watch TV', 2],
        ['Sleep',    7]
      ]);

      var options = {};

      var chartElement = document.getElementById('piechart');
      if (chartElement !== null) {
        var chart = new google.visualization.PieChart(chartElement);
        chart.draw(data, options);
      }
    }


    function drawBarChart () {
      var data = google.visualization.arrayToDataTable([
        ['Year', 'Sales', 'Expenses', 'Profit'],
        ['2014', 1000, 400, 200],
        ['2015', 1170, 460, 250],
        ['2016', 660, 1120, 300],
        ['2017', 1030, 540, 350]
      ]);

      var options: google.visualization.ColumnChartOptions = {
        legend: { position: 'none' }
      };

      var chartElement = document.getElementById('columnchart_material');
      if (chartElement !== null) {
        var chart = new google.visualization.ColumnChart(chartElement);
        chart.draw(data, options);
      }
    }


    function drawLineChart () {
      var data = google.visualization.arrayToDataTable([
        ['Year', 'Sales', 'Expenses'],
        ['2004',  1000,      400],
        ['2005',  1170,      460],
        ['2006',  660,       1120],
        ['2007',  1030,      540]
      ]);

      var options: google.visualization.LineChartOptions = {
        curveType: 'function'
      };

      var chartElement = document.getElementById('curve_chart');
      if (chartElement !== null) {
        var chart = new google.visualization.LineChart(chartElement);
        chart.draw(data, options);
      }
    }
}

The problem I am facing is that the chart is visible only when I click <i> twice!

How can I ensure that when I click <i></i> one single click, the changeChart() method should be called and chart should appear on HTML screen?

Daniel Beck
  • 20,653
  • 5
  • 38
  • 53
Saad Ali
  • 1
  • 1
  • Got the idea, instead of *ngIf, I used [hidden]. But space acquired will increase! Because chart is loaded but it's not visible there. – Saad Ali Aug 26 '23 at 04:33
  • Instead of `if (this.pieChart)` etc. say `if (chart === 'pie'`)` etc.. Then inside `google.charts.setOnLoadCallback` reassign `this.pieChart`, `this.lineChart`, and `this.barChart` – Benny Halperin Aug 27 '23 at 04:49

0 Answers0