Symfony4结合Twig、JS实现数据库数据柱状图展示的渲染异常排查
问题根因分析
- 循环边界完全放错位置:你现在把图表初始化、数据对象定义的整段JS逻辑全部嵌在Twig的库存遍历循环内部,每遍历1条库存记录,就会重新创建1次独立的图表实例、重新生成一套只有单条数据的图表配置,最后反复覆盖同一块画布上的渲染结果,根本没法形成多品类并列展示的柱状图。
- 数据结构组装错位:多品类库存柱状图需要的是「全量产品名组成的labels数组、全量对应库存值组成的data数组」,但你现在在循环里每次都只把当前单条产品、单条库存值拼成单元素数组,相当于每次都在画一个只有1根柱子的独立小图表,和预期的多柱对比效果完全不符。
- 重复操作同一画布上下文:每轮循环都获取同一个画布的2D上下文重复初始化图表,会引发画布上下文冲突,进一步导致渲染错乱。
调整后的可运行实现
核心改动思路:把Twig循环的范围缩小到仅负责向图表的空数据数组填充内容,整个图表初始化逻辑完全移出循环块,保证整个渲染流程只执行1次。
<script> // 提前初始化空的图表数据结构 let barChartData = { labels: [], datasets: [ { fillColor: "#FC8213", data: [] } ] }; // 循环仅负责遍历库存数据、向数组填充值 {% for stock in stocks %} barChartData.labels.push("{{ stock.idproduit.nom|e('js') }}"); barChartData.datasets[0].data.push({{ stock.quantite }}); {% endfor %} // 图表初始化逻辑仅执行1次,放在循环外部 new Chart(document.getElementById("bar").getContext("2d")).Bar(barChartData); </script>
额外优化提示
- 给产品名称渲染加
|e('js')Twig过滤器,避免产品名包含引号、特殊字符时触发JS语法报错,导致整个脚本失效。 - 如果实际使用的是Chart.js 2.x及以上版本,原有的
Bar()直接调用的写法已经被废弃,需要替换为新版的实例化语法,同时把配置项里的fillColor替换为兼容的backgroundColor字段,解决API版本不兼容问题。
内容的提问来源于stack exchange,提问作者Khalil Fathalli
相关产品推荐
相关产品推荐

