javascript - AmCharts 3 - 首次运行时删除监听器(自身内部的引用函数)

标签 javascript amcharts

我想知道如何添加只运行一次的监听器,我相信最终这主要是一个通用的 javascript 问题,但我可能遗漏了一些东西。

这是我所拥有的:

const listener = chart.addListener('rendered', () => {
    console.log('Chart rendered! This should only print once!');
    doSomethingToChart(chart);
    chart.removeListener(chart, 'rendered', listener);
})

这里的问题是,没有移除监听器,console.log 打印在每个渲染上。我该如何解决这个问题?

最佳答案

addListener 根本没有返回值,也没有提及 in the documentation ,这就是您的代码不起作用的原因。只需在添加监听器之前单独存储函数引用,然后对该引用调用 removeListener 即可,例如:

let counter = 0;
const listener = () => {
  console.log('dataUpdated called', counter += 1);
};

chart.addListener('dataUpdated', listener);

let timer = setInterval(() => {
  chart.validateData(); //triggers dataUpdated
  if (counter == 3)  {
    chart.removeListener(chart, 'dataUpdated', listener);
    console.log('dataUpdated removed')
    chart.validateData(); //one more call to confirm that the listner no longer runs
    clearInterval(timer);
  }

}, 1500);

演示:

var chart = AmCharts.makeChart("chartdiv", {
  "type": "serial",
  "theme": "light",
  "dataProvider": [{
    "country": "USA",
    "visits": 2025
  }, {
    "country": "China",
    "visits": 1882
  }, {
    "country": "Japan",
    "visits": 1809
  }, {
    "country": "Germany",
    "visits": 1322
  }, {
    "country": "UK",
    "visits": 1122
  }, {
    "country": "France",
    "visits": 1114
  }, {
    "country": "India",
    "visits": 984
  }, {
    "country": "Spain",
    "visits": 711
  }, {
    "country": "Netherlands",
    "visits": 665
  }, {
    "country": "Russia",
    "visits": 580
  }, {
    "country": "South Korea",
    "visits": 443
  }, {
    "country": "Canada",
    "visits": 441
  }, {
    "country": "Brazil",
    "visits": 395
  }],
  "graphs": [{
    "fillAlphas": 0.9,
    "lineAlpha": 0.2,
    "type": "column",
    "valueField": "visits"
  }],
  "categoryField": "country"
}, 100);

let counter = 0;
const listener = () => {
  console.log('dataUpdated called', counter += 1);
};

chart.addListener('dataUpdated', listener);

let timer = setInterval(() => {
  chart.validateData(); //this triggers dataUpdated
  if (counter == 3) {
    chart.removeListener(chart, 'dataUpdated', listener);
    console.log('dataUpdated removed')
    chart.validateData(); //confirm that listner isn't called anymore
    clearInterval(timer);
  }

}, 1500);
html,
body {
  width: 100%;
  height: 100%;
  margin: 0px;
}

#chartdiv {
  width: 100%;
  height: 100%;
}
<script src="//www.amcharts.com/lib/3/amcharts.js"></script>
<script src="//www.amcharts.com/lib/3/serial.js"></script>
<script src="//www.amcharts.com/lib/3/themes/light.js"></script>

<div id="chartdiv"></div>

关于javascript - AmCharts 3 - 首次运行时删除监听器(自身内部的引用函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55457502/

相关文章:

Amcharts 4 日期轴工具提示每周显示错误的日期(星期一而不是星期五)

javascript - 不知道如何实现 amcharts 的范围

javascript - AmMaps - 图像而不是区域的热图

javascript - 如何在 vanilla js 中实现 Observable 行为

javascript - Javascript 中 boolean 语句是如何计算的

javascript - TypeScript 的 "Combine JavaScript output into file"选项在没有///<reference> 标签的情况下无法推断出正确的脚本顺序

javascript - react : How to pass array of ids to method

javascript - 2 个图共享相同的 x 轴

javascript - Amcharts 带折线图的堆积柱形图将值轴置于折线图下方

javascript - 主干中的 listenTo 模型属性