销毁使用 Symfony 渲染的 ChartJS

Destroy ChartJS rendered with Symfony

我的 Symfony/ChartJS 申请有点问题。

因此,如果我使用 var myChart = new Chart.. 等 JS 创建图表,我可以使用 myChart.destory(); 轻松销毁图表,因为我可以处理 ChartObject。

我的问题: 我用我的 SymfonyController 渲染的第一个图表。所以我在我的控制器中渲染图表

return $this->render('category.html.twig', [
         'chart' => $chart]);

在 Twig 中,我为图表分配了一个 ID {{ render_chart(chart, {'id': 'my-chart'}) }}。 但我真的不知道如何在 Js 中处理整个 Chartobject。那么我如何才能破坏我用 Symfonycontroller 创建的图表呢?有人有什么建议吗?

提前致谢!

//编辑 const chart = Chart.getChart('my-chart'); 的正常方法也不起作用。这是我的 Canvas-ConsoleLog 以获取更多信息:

<canvas data-controller="symfony--ux-chartjs--chart" data-symfony--ux-chartjs--chart-view-value="(i deleted the values for better legibility)" id="my-chart" style="display: block; box-sizing: border-box; height: 407.778px; width: 816.667px;" width="735" height="367"></canvas>

奇怪的是: 当我尝试日志时:console.log(document.getElementById("my-chart").getContext("2d");); 它显示:

  CanvasRenderingContext2D {canvas: canvas#my-chart, globalAlpha: 1, globalCompositeOperation: 'source-over', filter: 'none', imageSmoothingEnabled: true, …}
canvas: canvas#my-chart
direction: "ltr"
fillStyle: "#000000"
filter: "none"
font: "12px \"Helvetica Neue\", Helvetica, Arial, sans-serif"
globalAlpha: 1
globalCompositeOperation: "source-over"
imageSmoothingEnabled: true
imageSmoothingQuality: "low"
lineCap: "butt"
lineDashOffset: 0
lineJoin: "miter"
lineWidth: 1
miterLimit: 10
shadowBlur: 0
shadowColor: "rgba(0, 0, 0, 0)"
shadowOffsetX: 0
shadowOffsetY: 0
strokeStyle: "#000000"
textAlign: "start"
textBaseline: "alphabetic"
[[Prototype]]: CanvasRenderingContext2D

所以日志显示图表被识别...

您可以使用 getChart api 方法 chart.js 暴露自身。

因此,当您知道 canvas 的 ID 时,您可以使用此 js 获取图表对象:

const chart = Chart.getChart('my-chart');

symfny-ux 控制器创建其 own instance of ChartJS inside an appropriate stimulus-controller, and this variable isn't directly accessible. But, symfony/ux developers are smart, and they created events (e.g. chartjs:connect) which you can listen to (link)

如果你这样做,你最终会得到一个 JS 原生 CustomEvent 对象,并且在这个事件的 details 属性 中你会找到传递的 chart 实例之前在 symfiny-ux-controller 中为 chart.js 创建 所以理论上你可以

document.addEventListener("chartjs:connect",(chartEv) => { 
console.log(chartEv.details); // chartEv.details.chart.destroy()
});

我确实建议您观看 Ryan's tutorial on Symfony UX,尤其是“扩展 UX 控制器”一章,其中他尝试使用先前创建的 new Chart() 实例,就像您的情况一样。