使用 NG2 图表动态更新圆环图

Dynamically update doughnut chart with NG2Charts

我正在进行一个项目,我正在制作一个常量营养素计算器。我有一个用于输入值的表单,它显示一个圆环图,其初始值为 0。但是当我点击提交按钮时,图表没有更新。

这是我的代码:

home.component.html

<form (submit)="addMeal(totalGrams, proteinGrams, fatGrams, carbGrams)">
              <div class="form-group">
                <input
                  class="form-control"
                  type="number"
                  placeholder="Total"
                  #totalGrams
                />
              </div>
              <div class="form-group">
                <input
                  class="form-control"
                  type="number"
                  placeholder="Protein"
                  #proteinGrams
                />
              </div>
              <div class="form-group">
                <input
                  class="form-control"
                  type="number"
                  placeholder="Fat"
                  #fatGrams
                />
              </div>
              <div class="form-group">
                <input
                  class="form-control"
                  type="number"
                  placeholder="Carbs"
                  #carbGrams
                />
              </div>

              <button type="submit" class="btn btn-primary btn-block">
                Enviar
              </button>
            </form>

我只提供了表单代码,因为布局很大,很多 bootstrap 组件并没有真正影响核心问题。

home.component.ts

import { Component, ViewChild } from '@angular/core';
import { ChartData, ChartType } from 'chart.js';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent {

  gProtein: number = 0;
  gCarbs: number = 0;
  gFat: number = 0;

  public doughnutChartLabels: string[] = [ 'Proteína', 'Carbohidratos', 'Grasa' ];
  public doughnutChartData: ChartData<'doughnut'> = {
    labels: this.doughnutChartLabels,
    datasets: [
      { data: [ this.gProtein, this.gCarbs, this.gFat ] },
    ]
  };
  public doughnutChartType: ChartType = 'doughnut';

  addMeal(totalGrams: HTMLInputElement, proteinGrams: HTMLInputElement, fatGrams: HTMLInputElement, carbGrams: HTMLInputElement) {
    this.doughnutChartData.datasets[0].data[0] = parseInt(proteinGrams.value);
    this.doughnutChartData.datasets[0].data[1] = parseInt(carbGrams.value);
    this.doughnutChartData.datasets[0].data[2] = parseInt(fatGrams.value);
    totalGrams.value = ''
    proteinGrams.value = ''
    fatGrams.value = ''
    carbGrams.value = ''
    totalGrams.focus()    
    return false;
  }

}

我不知道这个库最后一次更新是什么时候,但这是文档说你必须更新图表的方式(其他类型的图表,因为甜甜圈文档写得不是很好,imo) .

我也遇到了同样的情况。该文档实际上写得很好,但它并没有涵盖每个图表的每个场景,因此您必须在其他图表中寻找您要问的东西。我是看条形图解决的,你要做的就是这个

在你的 .ts 组件 中,导入这个:

import { BaseChartDirective } from 'ng2-charts';

然后,这个:

@ViewChild(BaseChartDirective) chart?: BaseChartDirective;

最后你要做的是这个(我格式化了你的 addMeal() 方法以便更好地阅读它):

addMeal(
    totalGrams: HTMLInputElement,
    totalCals: HTMLInputElement,
    proteinGrams: HTMLInputElement,
    fatGrams: HTMLInputElement,
    carbGrams: HTMLInputElement
  ) {
    this.doughnutChartData.datasets[0].data[0] =
      parseInt(totalCals.value) * (parseInt(totalGrams.value) / 100);
    this.doughnutChartData.datasets[0].data[1] =
      parseInt(proteinGrams.value) * (parseInt(totalGrams.value) / 100);
    this.doughnutChartData.datasets[0].data[2] =
      parseInt(carbGrams.value) * (parseInt(totalGrams.value) / 100);
    this.doughnutChartData.datasets[0].data[3] =
      parseInt(fatGrams.value) * (parseInt(totalGrams.value) / 100);
    this.chart?.chart?.update();
    totalGrams.value = '';
    totalCals.value = '';
    proteinGrams.value = '';
    fatGrams.value = '';
    carbGrams.value = '';
    return false;
  }

如您所见,我只添加了一行,就在您设置清空表单字段之前,即 update() 方法。

我想给你一个建议,那就是阅读完整的文档,或者至少在你问问题之前阅读你正在使用的东西的所有文档,因为这个东西解释得很好 here.