Canvas 已经在使用中。必须先销毁 ID 为“0”的图表,然后才能重新使用 ID 为“idpService”的画布

问题描述 投票:0回答:1

我要显示三种不同服务的三个图表。所以创建图表数组并推送每个新创建的图表。
这是我的代码。

      import Chart from 'chart.js;
      public charts: any;
      canvas: any;
      ctx: any;

      this.canvas = document.getElementById(serviceChart) as HTMLCanvasElement;
      this.ctx = this.canvas.getContext('2d');
        
    
      this.charts.push(new Chart(this.ctx, {
            // The type of chart we want to create
            type: 'bar',
            // The data for our dataset
            data: barChartDataCollection,
            // Configuration options go here
            options: this.barChartOptions
        }));

我正在获取 Canvas 已经在使用中。必须先销毁 ID 为“0”的图表,然后才能重新使用 ID 为“idpService”的画布。 创建新图表并推入数组时出错。创建图表后是否需要销毁每个图表?如果是,如何?在哪里销毁它?如果没有,那么解决方案是什么?请帮忙!

typescript chart.js angular-gridster2 angular-material-15
1个回答
0
投票

如果你不想同时看到图表,你可以简单地销毁当前/最上面的图表:

(this.charts[this.charts.length - 1] as Chart|undefined)?.destroy();

this.charts.push(new Chart( ......

如果你愿意销毁图表对象,那么将所有图表保存在一个数组中意义不大,只保留当前图表对象就足够了。

此外,在这种情况下,对于顺序图表,只需更改当前图表的数据和选项并调用其

.update()
方法来显示下一个图表几乎总是可能且更简单,因此您不会破坏并重新创建它。

另一个选项是为每个图表创建一个新的画布,这将允许图表并行显示。一个简化的版本是

const serviceCanvas = document.getElementById('serviceChart') as HTMLCanvas;
if(this.charts.length > 0){
   this.canvas = document.createElement('canvas');
   serviceCanvas.parentNode!.appendChild(this.canvas);
}
else{
    this.canvas = serviceCanvas;
}
© www.soinside.com 2019 - 2024. All rights reserved.