You need to enable JavaScript to run this app. Symfony4结合Twig、JS实现数据库数据柱状图展示的渲染异常排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 08:36:04