Chart.js包含嵌套数组的条形图

o2rvlv0m  于 2022-11-07  发布在  Chart.js
关注(0)|答案(1)|浏览(129)

我想制作一个可重复使用的堆叠条形图,并在Angular中使用@Input()属性。我的数据是一个嵌套数组。

我不知道如何正确设置我的图表,我总是在控制台中得到错误:
错误:未捕获(在承诺中):TypeError:无法读取未定义TypeError的属性“0”:无法读取未定义的属性ウ0 Ж。
示例数据:

barData = [[65, 59, 80, 81, 56, 55, 40], [28, 48, 40, 19, 86, 27, 90]];
barLabels = ["2006", "2007", "2008", "2009", "2010", "2011", "2012"];

代码:

@Input() barData!: (number | ScatterDataPoint | BubbleDataPoint)[][];
  @Input() barLabels!: string[];

  public barChartType: ChartType = "bar";
  public barChartData: ChartConfiguration["data"];

  defaultBarChartData: Partial<ChartConfiguration["data"]> = {
    labels: this.barLabels,
    datasets: [
      {
        data: this.barData[0],
        label: "Income",
        backgroundColor: "#3ABD32"
      },
      {
        data: this.barData[1],
        label: "Expense",
        backgroundColor: "#E02A45"
      },
    ],
  };

  ngOnInit(): void {
    if (
      this.barData !== undefined &&
      this.barLabels !== undefined &&
      Array.isArray(this.barData) &&
      this.barData.length > 0 &&
      Array.isArray(this.barLabels) &&
      this.barLabels.length > 0
    ) {
      this.barChartData = {
        ...this.defaultBarChartData,
        ...{ labels: this.barLabels },
      } as ChartConfiguration["data"];
      this.barChartData.datasets[0].data = this.barData[0];
    } else {
      throw new Error("Charts must have their data and labels inputs defined.");
    }
  }
  public barChartOptions: ChartConfiguration["options"] = {...}

其模板:

<canvas
    baseChart
    [data]="barChartData"
    [options]="barChartOptions"
    [type]="barChartType">
  </canvas>

有人能帮我找到我的设置中的错误吗?

cclgggtu

cclgggtu1#

defaultBarChartData逻辑的初始化值移至ngOnInit方法。
Angular - Input开始,
将类字段标记为输入属性并提供配置元数据的装饰器。输入属性绑定到模板中的DOM属性。在更改检测期间,Angular会自动使用DOM属性的值更新数据属性。
为了保证带有@Input()装饰器的变量被更新为值,因此需要ngOnInit
ngOnInit()
在Angular先显示数据系结属性并设定指示词或元件的输入属性之后,初始化指示词或元件。

defaultBarChartData: Partial<ChartConfiguration['data']>;

ngOnInit(): void {
  this.defaultBarChartData = {
    labels: this.barLabels,
    datasets: [
      {
        data: this.barData[0],
        label: 'Income',
        backgroundColor: '#3ABD32',
      },
      {
        data: this.barData[1],
        label: 'Expense',
        backgroundColor: '#E02A45',
      },
    ],
  };

  ...
}

Sample StackBlitz Demo

相关问题