vue.js 以编程方式隐藏系列/切换图例项(amcharts 4)

ua4mk5z4  于 7个月前  发布在  Vue.js
关注(0)|答案(1)|浏览(97)

在我们的项目中,我们有一个带有图例的折线图。图表和它的图例都在单独的容器中初始化(以防这个事实很重要)。

<div ref="chartdiv" />
<div ref="legenddiv" />

字符串
我们使用一个自定义的FromConfig方法来创建它们。x1c 0d1x
我试图实现:我们有一个页面上的多个选项卡,用户通常切换图例项目显示/隐藏一些系列。我需要存储这些切换图例项目,以便当用户返回到与图表的选项卡,我将能够切换他们回来编程。
从我的理解一个算法到这个如下:
1.将已切换的项目存储在某个位置
1.当图表启动时,切换先前切换的项目。据我所知,应该通过显示/隐藏系列来完成,而不是图例项目。
到目前为止,我已经设法通过向图例项添加单击处理程序来存储标签。

chart.value.legend.itemContainers.template.events.on('hit', (ev) => {
  toggledItems.push(ev.target.dataItem.name)
})


但是我没有成功隐藏以前切换的图例项。我试图根据this question实现堆栈溢出,我试图使用'inited','hidden','showed'事件,但没有React。

// Nothing happens here ☹️
chart.value.series.template.events.on('hidden', () => {
  console.log('I am hidden')
})


拜托,给我指个方向。

kgqe7b3p

kgqe7b3p1#

找到了一个解决方案。希望这能帮助到别人。我们在项目中有一个Line图表组件。我添加了一个toggleSeries prop -一个用于切换图例/系列项目的v模型,它存储字符串(名称)。所以当我们单击图例项目时,我们会输入图例项目的名称并更新toggleSeries v模型。有一个双向绑定,我们可以初始化一个已经在toggleSeries数组中有项目的图表,或者我们可以把来自Line组件外部的项目放在移动中-图表将被更新。

// Is used for toggling series in chart's 'beforevalidated' hook
    const toggleSeries = (initial?: boolean) => {
      for (const currentSeries of chart.value.series.values) {
        if (toggledSeriesInternal.value.includes(currentSeries.dataFields.valueY)) {
          if (initial) {
            currentSeries.hidden = true
          }
          else {
            currentSeries.hide()
          }
        }
        else {
          if (initial) {
            currentSeries.hidden = false
          }
          else {
            currentSeries.show()
          }
        }
      }
    }

    // Is used for toggling single series items === pushing/removing item names
    // from 'toggledSeries' array
    const toggleSeriesItem = (itemName: string) => {
      const index = toggledSeriesInternal.value.findIndex(name => name === itemName)
      if (index === -1) {
        toggledSeriesInternal.value = [...toggledSeriesInternal.value, itemName]
      }
      else {
        const newToggledSeries = [...toggledSeriesInternal.value]
        newToggledSeries.splice(index, 1)
        toggledSeriesInternal.value = newToggledSeries
      }
    }

    chart.value.events.on('beforevalidated', () => {
      toggleSeries(true)
    })

    chart.value.legend.itemContainers.template.events.on('hit', (ev) => {
      toggleSeriesItem((ev.target.dataItem as am4core.DataItem & { name: string }).name)
    })

    watch(toggledSeriesInternal, () => {
      toggleSeries()
    }, {
      deep: true,
    })

字符串

相关问题