You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中通过控制器更新Chart.js图表的问题求助

解决Laravel中日期选择器更新Chart.js图表的问题

核心思路是:保存Chart实例的全局引用,在AJAX拿到新数据后直接修改图表的data属性并调用update方法,具体步骤和代码如下:

1. 确保Chart实例可全局访问

初始化图表时,把实例存在全局变量里,这样AJAX回调能直接操作它。

2. AJAX回调中更新图表数据

拿到后端返回的JSON数据后,替换图表的labels和datasets数据,再调用chart.update()触发图表重绘。

完整示例代码

视图部分(Blade模板)

<div class="chart-container">
    <input type="date" id="datePicker" class="form-control mb-3">
    <canvas id="myChart" height="300"></canvas>
</div>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
    // 全局保存图表实例
    let myChart;

    // 初始化图表的通用函数
    function renderChart(labels, datasetData) {
        const ctx = document.getElementById('myChart').getContext('2d');
        
        // 如果已有实例,先销毁避免重复创建
        if (myChart) {
            myChart.destroy();
        }

        myChart = new Chart(ctx, {
            type: 'line', // 根据需求更换类型:bar、pie等
            data: {
                labels: labels,
                datasets: [{
                    label: '每日数据统计',
                    data: datasetData,
                    borderColor: '#3b82f6',
                    backgroundColor: 'rgba(59, 130, 246, 0.1)',
                    tension: 0.3
                }]
            },
            options: {
                responsive: true,
                scales: {
                    y: {
                        beginAtZero: true,
                        title: {
                            display: true,
                            text: '数值'
                        }
                    },
                    x: {
                        title: {
                            display: true,
                            text: '时间段'
                        }
                    }
                }
            }
        });
    }

    // 页面加载时用初始数据渲染图表(假设后端已传递初始数据)
    document.addEventListener('DOMContentLoaded', function() {
        const initialData = @json($initialChartData);
        renderChart(initialData.labels, initialData.data);
    });

    // 日期选择器变化时触发AJAX请求
    document.getElementById('datePicker').addEventListener('change', function() {
        const selectedDate = this.value;

        fetch('/api/chart-data', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
            },
            body: JSON.stringify({ selected_date: selectedDate })
        })
        .then(res => res.json())
        .then(response => {
            // 两种更新方式选其一:
            // 方式1:销毁重建(适合需要修改图表配置的场景)
            renderChart(response.labels, response.data);
            // 方式2:直接更新数据(性能更好,适合仅改数据的场景)
            // myChart.data.labels = response.labels;
            // myChart.data.datasets[0].data = response.data;
            // myChart.update();
        })
        .catch(err => console.error('数据请求失败:', err));
    });
</script>

Laravel控制器部分(确认返回格式匹配)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ChartController extends Controller
{
    public function getChartData(Request $request)
    {
        $selectedDate = $request->input('selected_date');
        
        // 替换为你的业务查询逻辑,从数据库获取对应日期的标签和数据
        $labels = ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'];
        $data = [15, 22, 30, 25, 18, 28];

        return response()->json([
            'labels' => $labels,
            'data' => $data
        ]);
    }
}

关键注意事项

  • CSRF令牌:AJAX POST请求必须携带Laravel的CSRF令牌,通过页面的<meta name="csrf-token" content="{{ csrf_token() }}">获取。
  • 数据格式一致性:后端返回的JSON必须包含labels和data字段,和图表初始化时的结构匹配。
  • 更新方式选择:直接修改data后调用update()性能更优,适合仅更新数据的场景;销毁重建适合需要修改图表类型、样式配置的场景。

内容的提问来源于stack exchange,提问作者LaravelScrub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:22:34