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

Angular Chart.js实现点击Ng2折线图图例同步触发其他图表图例点击

Ng2折线图多图表图例同步点击解决方案

核心逻辑:通过统一维护图例显隐状态,监听单图图例点击事件后广播状态变更,同步刷新所有图表实例。

实现步骤

  • 第一步:维护公共图例显隐状态
    可以通过 Angular 服务或者父组件变量存储所有图例的显隐状态,数据结构参考:
    // key为图例名称,value为是否显示
    legendVisibility: Record<string, boolean> = {}
    // 存储所有Ng2折线图实例
    @ViewChildren(BaseChartDirective) chartList: QueryList<BaseChartDirective>
    
  • 第二步:配置每个图表的图例点击回调
    在每个折线图的chartOptions中配置图例点击事件,触发公共状态更新:
    public lineChartOptions: ChartConfiguration['options'] = {
      plugins: {
        legend: {
          onClick: (event, legendItem, legend) => {
            const targetLabel = legendItem.text
            // 翻转当前图例显隐状态
            const newVisibility = !this.legendVisibility[targetLabel]
            this.legendVisibility[targetLabel] = newVisibility
            // 触发所有图表同步更新
            this.syncAllCharts(targetLabel, newVisibility)
          }
        }
      }
    }
    
  • 第三步:实现同步更新方法
    遍历所有图表实例,更新对应数据集的显隐状态后刷新图表:
    syncAllCharts(label: string, visibility: boolean) {
      this.chartList.forEach(chart => {
        // 找到对应名称的数据集索引
        const datasetIndex = chart.chart?.data.datasets.findIndex(ds => ds.label === label)
        if (datasetIndex !== undefined && datasetIndex > -1) {
          // 更新数据集隐藏状态
          chart.chart!.data.datasets[datasetIndex].hidden = !visibility
          // 刷新图表
          chart.update()
        }
      })
    }
    
  • 第四步:初始化状态同步
    图表首次渲染完成后,将所有图例的初始显隐状态同步到legendVisibility中,避免初始状态不一致。

效果说明

点击任意一个图表的图例后,所有图表的同名称图例对应数据集会同步显隐,效果符合预期:
问题示意图

注意:如果不同图表的图例命名不统一,可以额外维护一个图例名称映射表,替换代码中按label匹配的逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:02