You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

尝试销毁Chart.js对象时触发TypeError错误的问题求助

解决Chart.js destroy()调用时的TypeError问题

针对你遇到的Cannot read properties of undefined (reading 'destroy')错误,本质是调用destroy()时Chart实例未被正确初始化或已丢失,结合你使用的旧版本技术栈,给出以下具体解决方案:

1. 正确初始化Chart实例变量

在组件类中明确声明并初始化Chart变量,避免未定义状态:

import { Chart } from 'chart.js';

export class YourComponent {
  // 初始化为undefined,明确类型
  chart1: Chart | undefined;
  chart2: Chart | undefined;
}

2. 调用destroy前先做存在性校验

每次销毁图表前,先判断实例是否存在,避免直接调用undefined的方法:

clearCharts(): void {
  // 销毁第一个图表
  if (this.chart1) {
    this.chart1.destroy();
    this.chart1 = undefined; // 销毁后重置变量,避免后续重复调用报错
  }
  // 销毁第二个图表
  if (this.chart2) {
    this.chart2.destroy();
    this.chart2 = undefined;
  }
}

3. 结合@ViewChild确保DOM元素存在

直接通过document.getElementById获取canvas可能存在DOM未加载完成的问题,改用Angular的@ViewChild获取模板元素,确保在DOM渲染完成后再初始化图表:

import { ViewChild, ElementRef, AfterViewInit } from '@angular/core';

export class YourComponent implements AfterViewInit {
  @ViewChild('barChart1') barChart1!: ElementRef<HTMLCanvasElement>;
  @ViewChild('barChart2') barChart2!: ElementRef<HTMLCanvasElement>;
  chart1: Chart | undefined;
  chart2: Chart | undefined;

  ngAfterViewInit(): void {
    // 组件视图初始化完成后再创建图表
    this.renderChart1();
  }

  renderChart1(): void {
    // 先清除旧图表
    this.clearCharts();
    
    const ctx = this.barChart1.nativeElement.getContext('2d');
    if (ctx) {
      this.chart1 = new Chart(ctx, {
        type: 'bar',
        data: { /* 你的查询结果数据 */ },
        options: { /* 图表配置 */ }
      });
    }
  }

  clearCharts(): void {
    // 同步骤2的销毁逻辑
    if (this.chart1) {
      this.chart1.destroy();
      this.chart1 = undefined;
    }
    if (this.chart2) {
      this.chart2.destroy();
      this.chart2 = undefined;
    }
  }
}

对应的HTML模板要添加模板引用变量:

<canvas #barChart1></canvas>
<canvas #barChart2></canvas>

4. 避免在错误的生命周期钩子初始化图表

不要在ngOnInit中创建图表,此时组件视图尚未渲染完成,canvas元素可能不存在,导致Chart实例初始化失败,后续调用destroy()时变量仍为undefined。

旧版本注意事项

由于你使用的是Chart.js 2.9.4和ng2-charts 2.4.2,需注意:

  • destroy()方法执行后,必须手动将实例变量置为undefined,否则下次创建图表时可能出现DOM元素复用的问题
  • 多个图表实例要分别管理,不要复用同一个变量

内容的提问来源于stack exchange,提问作者liberlux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:47