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

Angular 16中ECharts调用API后Restore选项失效问题求助

解决Angular 16中ECharts点击Restore后回到空初始状态的问题

问题根源在于ECharts的Restore功能会将图表重置为初始传入的options配置,你初始的chartOption数据为空,而merge仅做动态数据合并,并未修改原始chartOption,因此恢复后会回到空数据状态。以下是三种可行解决方案:


方案1:直接更新原始chartOption(推荐)

API返回数据后,直接修改chartOption中的数据部分,让初始配置与动态数据保持同步,这样Restore时会使用更新后的配置。

组件代码:

// 初始配置(数据为空)
chartOption = {
  xAxis: { type: 'category', data: [] },
  yAxis: { type: 'value' },
  series: [{ type: 'line', data: [] }],
  dataZoom: [{ type: 'inside' }, { type: 'slider' }]
};
isLoading = false;

fetchData() {
  this.isLoading = true;
  this.apiService.getData().subscribe(res => {
    // 解构合并,更新数据部分
    this.chartOption = {
      ...this.chartOption,
      xAxis: { ...this.chartOption.xAxis, data: res.xData },
      series: [{ ...this.chartOption.series[0], data: res.seriesData }]
    };
    this.isLoading = false;
  });
}

模板代码:

移除[merge]属性,仅保留更新后的chartOption:

<div 
  echarts (chartInit)="onChartInit($event)" 
  (chartFinished)="chartFinished()" 
  [loading]="isLoading" 
  [options]="chartOption" 
  class="demo-chart">
</div>

方案2:监听Restore事件,重新加载数据

通过ECharts实例监听restore事件,触发时重新调用API获取数据并合并。

组件代码:

private chartInstance: any;
dynamicData: any = {};
isLoading = false;

onChartInit(chart: any) {
  this.chartInstance = chart;
  // 监听Restore按钮点击事件
  this.chartInstance.on('restore', () => {
    this.fetchData();
  });
}

fetchData() {
  this.isLoading = true;
  this.apiService.getData().subscribe(res => {
    this.dynamicData = {
      xAxis: { data: res.xData },
      series: [{ data: res.seriesData }]
    };
    this.isLoading = false;
  });
}

模板代码:

保持原有的[merge]配置即可:

<div 
  echarts (chartInit)="onChartInit($event)" 
  (chartFinished)="chartFinished()" 
  [loading]="isLoading" 
  [merge]="dynamicData" 
  [options]="chartOption" 
  class="demo-chart">
</div>

方案3:自定义Restore按钮,替换默认功能

隐藏ECharts默认的Restore按钮,自己实现仅重置缩放、不重置数据的按钮。

组件代码:

private chartInstance: any;
chartOption = {
  xAxis: { type: 'category', data: [] },
  yAxis: { type: 'value' },
  series: [{ type: 'line', data: [] }],
  dataZoom: [
    { type: 'inside', restore: { show: false } }, // 隐藏默认Restore
    { type: 'slider', restore: { show: false } }
  ]
};
dynamicData: any = {};
isLoading = false;

onChartInit(chart: any) {
  this.chartInstance = chart;
}

// 自定义重置缩放方法
resetZoom() {
  this.chartInstance.dispatchAction({
    type: 'dataZoom',
    dataZoomIndex: 0,
    start: 0,
    end: 100
  });
  this.chartInstance.dispatchAction({
    type: 'dataZoom',
    dataZoomIndex: 1,
    start: 0,
    end: 100
  });
}

fetchData() {
  this.isLoading = true;
  this.apiService.getData().subscribe(res => {
    this.dynamicData = {
      xAxis: { data: res.xData },
      series: [{ data: res.seriesData }]
    };
    this.isLoading = false;
  });
}

模板代码:

添加自定义按钮,保留原图表配置:

<button (click)="resetZoom()">恢复缩放</button>
<div 
  echarts (chartInit)="onChartInit($event)" 
  (chartFinished)="chartFinished()" 
  [loading]="isLoading" 
  [merge]="dynamicData" 
  [options]="chartOption" 
  class="demo-chart">
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:43:16