Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

11
respostas

Atualizar gráfico após consulta server

Método que faz a consulta no servidor e está funcionando normal, isto é buscando as informações corretas:

 private montarGrafico(){
    let pesquisa = new PesquisaResultadoModel;
    pesquisa.ano = this.ano;
    this.pesquisaService.pesquisar(pesquisa).subscribe(
      (data :any) => {
        data.lista.forEach(lista => {
          this.pieChartLabels.push(lista.mes);
          this.pieChartData.push();
        });
      }, err => {
        this.openSnackBar('Erro ao montar gráfico !', false);
      }
    );
  }

html

<div fxFlex *ngIf="mostrar">
    <mat-card *ngIf="pieChartLabels">
      <mat-card-header>
        <mat-card-title>Gráfico para o ano</mat-card-title>
      </mat-card-header>
      <mat-card-content>
        <canvas baseChart width="500" height="200" [data]="pieChartData" 
          [labels]="pieChartLabels" [chartType]="pieChartType" 
          (chartClick)="chartClicked($event)">
        </canvas>
      </mat-card-content>
    </mat-card>
  </div>

Mostra normalmente, mas não atualiza o gráfico.

Pesquisei e não achei. Como faço para atualizar o gráfico após a consulta no server ?

11 respostas

Fala aí Guilherme, tudo bem? Como você está fazendo para chamar a função responsável por atualizar o gráfico?

Me passe mais detalhes sobre o cenário por favor.

Fico no aguardo.

Olá.

Fala aí Guilherme, tudo bem? Como você está fazendo para chamar a função responsável por atualizar o gráfico?

R: Pois é, acho que este é o problema. Eu fiz a consulta, que retorna os dados corretos e não sei como atualizar o componente.

Meu código TS

O código typeScript está assim:

    import { element } from 'protractor';
    import { Component, OnInit } from '@angular/core';

    import { MatSnackBar, MatTableDataSource } from '@angular/material';

    import { PesquisaResultadoModel } from './../../model/pesquisa.model';

    import { PesquisaService } from './../../servico/pesquisa/pesquisa.service';

    @Component({
      selector: 'app-pesquisa',
      templateUrl: './pesquisa.component.html',
      styleUrls: ['./pesquisa.component.scss']
    })
    export class PesquisaComponent implements OnInit {

      public ano : number;
      public mes : string;
      public meses : any[];
      public mostrar : boolean;

      public displayedColumns = ['mes', 'valor'];

      public dataSource : MatTableDataSource<PesquisaResultadoModel>;

      // Gráfico
      public pieChartLabels: string[] = [];
      public pieChartData: number[] = [];
      public pieChartType: string;

      constructor(
        private snackBar: MatSnackBar,
        private pesquisaService : PesquisaService
      ) {}

      ngOnInit() {
        this.mostrar = false;
        this.buscarMeses();
        this.pieChartType = 'pie';
      }

      public pesquisar(){
        this.mostrar = false;
        let pesquisa = new PesquisaResultadoModel;
        pesquisa.ano = this.ano;
        pesquisa.mes = this.mes;
        this.pesquisaService.pesquisar(pesquisa).subscribe(
          (data :any) => {
            if(data.lista != null){
              this.mostrar = true;
              this.dataSource = data.lista;
              this.montarGrafico();
            }
            this.openSnackBar(data.tipoMensagem.mensagem, this.mostrar);
          }, err => {
            this.openSnackBar('Erro no servidor !', false);
          }
        );
      }

      private montarGrafico(){
        let pesquisa = new PesquisaResultadoModel;
        pesquisa.ano = this.ano;
        this.pesquisaService.pesquisar(pesquisa).subscribe(
          (data :any) => {
            data.lista.forEach(lista => {
              this.pieChartLabels.push(lista.mes);
              this.pieChartData.push();
            });
          }, err => {
            this.openSnackBar('Erro ao montar gráfico !', false);
          }
        );
      }

      public buscarMeses(){
        this.pesquisaService.carregarMeses().subscribe(
          (data :any) => {
            this.meses = data.lista;
          }, err => {
            this.openSnackBar('Erro no servidor !', false);
          }
        );
      }

      public limpar(){
        this.ano = null;
        this.mes = null;
        this.dataSource = null;
        this.mostrar = false;
      }

      private openSnackBar(message: string, isOnline : boolean) {
        this.snackBar.open(message, null, {
          duration: 3000, 
          panelClass: isOnline ? ["online", "onlineAction"] : "offline" 
        });
      }

      public chartClicked(e: any): void {}
    }

Fala aí Guilherme, bom, vamos lá.

Em nenhum momento vi você criando, populando e mandando desenhar o gráfico.

No caso da chart.js você vai precisar adicionar um canvas para receber o gráfico:

<canvas id="myChart" width="400" height="400"></canvas>

Depois, você precisa criar um objeto referente ao tipo de gráfico que deseja e passar algumas informações para ele, por exemplo:

const ctx = document.getElementById("myChart").getContext('2d');
const myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        }
    }
});

Com esse código já seria possível exibir o gráfico.

Você basicamente vai precisar fazer algo parecido no Angular (a ideia e implementação são as mesmas).

Espero ter ajudado.

Sim Matheus, sobre isso Em nenhum momento vi você criando, populando e mandando desenhar o gráfico., não tem mesmo. É o que preciso.

Mas se analisar o canvas já tem, não seria esse ?

<canvas baseChart width="500" height="200" [data]="pieChartData" 
          [labels]="pieChartLabels" [chartType]="pieChartType" 
          (chartClick)="chartClicked($event)">

Entendo que teria que construir as informações e atualizar o componente.

Mas acredito que deve ser conforme você informou. const ctx = document.getElementById("myChart").getContext('2d'); const myChart = new Chart(

Vou ver o que ajusto aqui.

grato.

Fala aí Guilherme, exatamente, a população e desenho do gráfico é feita ao instanciar a classe e passar como parâmetro o canvas que ele deve ser desenhado.

Esse código que te mandei está no ngOnInit (com dados diferentes) do meu componente (só preciso desenhar ao carregá-lo).

Essa biblioteca é a Chart.js

Espero ter ajudado.

Fala Matheus. Hoje consegui resolver. Mas ao entrar na página https://www.chartjs.org/, vi que existem outros. Mas como fazer eles em Angular ?

Não vi exemplos.

As informações vem correto no banco de dados. Creio que estou passando para um ARRAY ou lista no Typescript, mas monta o gráfico errado.

labels corretos, que vem do banco de dados

dados corretos, que vem do banco de dados

monta o gráfico errado

Código que monta o gráfico

this.vWGraficoMovimentoEstoqueService.pesquisar(consultaGrafico).subscribe(
              (grafico: any) => {
                this.spinner.show();
                const list: number[] = [];
                const informacao: string[] = [];
                grafico.lista.forEach((element: any) => {
                  informacao.push(element.mes.codigo + '/' + element.ano);
                  list.push(element.valorTotal);
                });
                const canvas = <HTMLCanvasElement> document.getElementById('myChart');
                const ctx = canvas.getContext('2d');
                const myChart = new Chart(ctx, {
                    type: 'bar',
                    data: {
                        labels: [informacao],
                        datasets: [{
                            label: 'Valores conforme pesquisa',
                            data: [1, 2, 3, 4],
                            backgroundColor: [
                                'rgba(255, 99, 132, 0.2)',
                                'rgba(54, 162, 235, 0.2)',
                                'rgba(255, 206, 86, 0.2)',
                                'rgba(75, 192, 192, 0.2)',
                                'rgba(153, 102, 255, 0.2)',
                                'rgba(255, 159, 64, 0.2)'
                            ],
                            borderColor: [
                                'rgba(255,99,132,1)',
                                'rgba(54, 162, 235, 1)',
                                'rgba(255, 206, 86, 1)',
                                'rgba(75, 192, 192, 1)',
                                'rgba(153, 102, 255, 1)',
                                'rgba(255, 159, 64, 1)'
                            ],
                            borderWidth: 1
                        }]
                    },
                    options: {
                        scales: {
                            yAxes: [{
                                ticks: {
                                    beginAtZero: true
                                }
                            }]
                        }
                    }
                });
                this.spinner.hide();
              }, (err: any) => {
                this.mensagemTela('Mensagem de erro', '', 'Erro no servidor !', false);
                this.spinner.hide();
              }
            );

O que pode ser ?

Fala ai Guilherme, tudo bem? Me passa o exemplo final que precisa montar, eu monto um aqui e te mando para servir como base.

Fico no aguardo.

Eu consegui implementar com fusioCharts.

Boa Guilherme, parabéns.

Não deixe de marcar o tópico como solucionado, assim pode servir de ajuda para outros alunos.

Abraços e bons estudos.