检查图表是否在 apexcharts 中呈现
Check if chart is rendered in apexcharts
我是 destroying the chart 但是当它没有呈现时我得到错误。
有没有办法检查图表是否已呈现,然后销毁它?
if(chart)
chart.destroy()
每次我销毁一个不存在的对象时,我都会得到 TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'.
还有就是没渲染的话我要再渲染一遍,我不会再渲染一遍。我需要那张支票
链接的文档指出,render()
return一旦将图表绘制到页面上就是一个承诺。
然而,代码似乎 return 立即承诺(这是有道理的)并在绘制图表时解决该承诺。
据我所知,在 promise 像这样解决后设置并保持状态标志应该就足够了:
let chart = new ApexCharts(el, options);
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
/* ... */
if (chart.ohYeahThisChartHasBeenRendered) {
chart.destroy();
}
评论后更新
是的,这有效!我为您制作了这个可运行的示例(通常这是 提问 问题的人的职责 ;) )按下按钮并检查日志:
<html>
<head>
<title>chart test</title>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<head>
<body>
<div id="chart"></div>
<script>
let options = {
chart: { type: 'line' },
series: [{ name: 'sales', data: [30,40,35,50,49,60,70,91,125] }],
xaxis: { categories: [1991,1992,1993,1994,1995,1996,1997, 1998,1999]}
},
chart = new ApexCharts(document.querySelector("#chart"), options),
logChart = () => console.log(chart),
destroyChart = () => {
if (chart.ohYeahThisChartHasBeenRendered) {
chart.destroy();
chart.ohYeahThisChartHasBeenRendered = false;
}
};
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
</script>
<button onclick="logChart()">Log chart</button>
<button onclick="destroyChart()">Destroy chart</button>
</body>
</html>
我怀疑您尝试过这样的操作来检查标志:
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
console.log(chart.ohYeahThisChartHasBeenRendered);
它不会做你期望的,因为承诺还没有解决。
再评论更新
正如评论所指出的,apexcharts 存在一个相关的已知问题:
https://github.com/apexcharts/apexcharts.js/pull/415
尽管这个问题要求“检查图表是否已呈现”,但代码表明他们实际上想要“检查图表是否存在”。我还想在渲染之前检查图表是否存在,我怀疑这是更常见的问题。
我不确定此处接受的答案。似乎这个答案总是创建一个新图表,因此不需要检查图表是否存在。
我为此工作了一段时间 - 没有得到文档的帮助 - 最终发现了 Apex
对象。查看 Apex._chartInstances
:此字段在任何图表呈现之前未定义,并且在呈现时,它们会在此处存储引用。至少经过一次渲染后,该字段的长度等于现有图表的数量。
检查是否存在任何图表:(Apex._chartInstances === undefined)
检查当前是否存在任何图表:(Apex._chartInstances.length > 0)
访问现有图表的 ID:(Apex._chartInstances[0].id)
这些位足以让它适用于我的情况。希望这对其他人有帮助。
我是 destroying the chart 但是当它没有呈现时我得到错误。
有没有办法检查图表是否已呈现,然后销毁它?
if(chart)
chart.destroy()
每次我销毁一个不存在的对象时,我都会得到 TypeError: Failed to execute 'removeChild' on 'Node': parameter 1 is not of type 'Node'.
还有就是没渲染的话我要再渲染一遍,我不会再渲染一遍。我需要那张支票
链接的文档指出,render()
return一旦将图表绘制到页面上就是一个承诺。
然而,代码似乎 return 立即承诺(这是有道理的)并在绘制图表时解决该承诺。 据我所知,在 promise 像这样解决后设置并保持状态标志应该就足够了:
let chart = new ApexCharts(el, options);
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
/* ... */
if (chart.ohYeahThisChartHasBeenRendered) {
chart.destroy();
}
评论后更新
是的,这有效!我为您制作了这个可运行的示例(通常这是 提问 问题的人的职责 ;) )按下按钮并检查日志:
<html>
<head>
<title>chart test</title>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<head>
<body>
<div id="chart"></div>
<script>
let options = {
chart: { type: 'line' },
series: [{ name: 'sales', data: [30,40,35,50,49,60,70,91,125] }],
xaxis: { categories: [1991,1992,1993,1994,1995,1996,1997, 1998,1999]}
},
chart = new ApexCharts(document.querySelector("#chart"), options),
logChart = () => console.log(chart),
destroyChart = () => {
if (chart.ohYeahThisChartHasBeenRendered) {
chart.destroy();
chart.ohYeahThisChartHasBeenRendered = false;
}
};
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
</script>
<button onclick="logChart()">Log chart</button>
<button onclick="destroyChart()">Destroy chart</button>
</body>
</html>
我怀疑您尝试过这样的操作来检查标志:
chart.render().then(() => chart.ohYeahThisChartHasBeenRendered = true);
console.log(chart.ohYeahThisChartHasBeenRendered);
它不会做你期望的,因为承诺还没有解决。
再评论更新
正如评论所指出的,apexcharts 存在一个相关的已知问题: https://github.com/apexcharts/apexcharts.js/pull/415
尽管这个问题要求“检查图表是否已呈现”,但代码表明他们实际上想要“检查图表是否存在”。我还想在渲染之前检查图表是否存在,我怀疑这是更常见的问题。
我不确定此处接受的答案。似乎这个答案总是创建一个新图表,因此不需要检查图表是否存在。
我为此工作了一段时间 - 没有得到文档的帮助 - 最终发现了 Apex
对象。查看 Apex._chartInstances
:此字段在任何图表呈现之前未定义,并且在呈现时,它们会在此处存储引用。至少经过一次渲染后,该字段的长度等于现有图表的数量。
检查是否存在任何图表:(Apex._chartInstances === undefined)
检查当前是否存在任何图表:(Apex._chartInstances.length > 0)
访问现有图表的 ID:(Apex._chartInstances[0].id)
这些位足以让它适用于我的情况。希望这对其他人有帮助。