在表单提交和页面重新加载后更新chart.js

时间:2018-01-20 04:41:38

标签: ajax django chart.js

我有一个chart.js条形图,通过ajax调用将数据拉到Django APIView。 ajax调用返回一个带有一堆数据的字典,用于自定义图表。这是chart.js代码:

var current_year = '{% url "saveskore:api-current-year-savings" %}'

$.ajax({
    url: current_year,
    type: 'GET',
    cache: false,
    dataType: 'json',
    success: function(data) {
      var ctx = document.getElementById('current-year-chart');
      var chart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: data['dates'],
                datasets: [
                            {
                              label: data['income_label'],
                              backgroundColor: "#8e5ea2",
                              data: data['income'],
                              },
                            {
                              label: data['expense_label'],
                              backgroundColor: 'green',
                              data: data['expenses'],
                              },
                            {
                              label: data['savings_label'],
                              backgroundColor: "#3e95cd",
                              data: data['savings_goal'],
                              },
                            {
                              label: data['avail_label'],
                              backgroundColor: "#pink",
                              data: data['avail_to_spend'],
                              },
                ]
            },
            options: {
                legend: { display: false },
                title: {
                  display: true,
                  text: 'Savings for ' + data['year']
                }
          }
        });
    }
});

效果很好。看起来很棒。

但是!我在一个单独的页面上有一个django formset,用于更新图表所从的表数据。

当我更新formset中的数据并提交时,重定向到图表页面......没有更新发生。

如果我更改代码或以其他方式重新加载浏览器,VOILA,图表会更新。

我已经阅读过关于cache=falsechart.update()的内容,但发现我无法完成任何工作,主要是因为其使用的具体细节尚不清楚。

我真的很感激这方面的意见。

1 个答案:

答案 0 :(得分:1)

您是否尝试过chart.destroy()方法?然后使用新数据再次构建图表..这对我有用..看看我的例子



let flag = 0;
var xChart = "";
function dibujar(valor, meses) {
    try {
        if (valor.length > 0) {
            $('#grafico').fadeIn('fast');
            var canvas = document.getElementById('chart');
            let tipGra = $('#slcTipGra').val();

            if (flag !== 0) {
                xChart.destroy();
            }
            //rgba(54, 162, 235, 0.2)
            if (tipGra === "bar" || tipGra === "horizontalBar") {
                var data = {
                    labels: meses,
                    datasets: [
                        {
                            label: "Dólares($)",
                            backgroundColor: "#3e95cd",
                            borderColor: "#3e95cd",
                            borderWidth: 2,
                            hoverBackgroundColor: "#3e95cd",
                            hoverBorderColor: "#3e95cd",
                            data: valor,
                        }
                    ]
                };

                var option = {
                    title: {
                        display: true,
                        fontSize: 20,
                        fontFamily: 'Helvetica',
                        text: 'Reporte Mensual de Ventas'
                    },
                    plugins: {
                        datalabels: {
                            color: 'white',
                            anchor: 'end',
                            align: 'start',
                            font:
                            {
                                weight: 'bold'
                            }
                        }
                    },
                    scales: {
                        yAxes: [{
                            stacked: true,
                            gridLines:
                            {
                                display: true,
                                color: "rgba(255,99,132,0.2)"
                            }
                        }],
                        xAxes: [{
                            gridLines: {
                                display: true
                            }
                        }]
                    }
                };
            }

            if (tipGra === 'line') {
                var data = {
                    labels: meses,
                    datasets: [
                        {
                            label: "Dólares($)",
                            fill: false,
                            lineTension: 0.1,
                            backgroundColor: "rgba(75,192,192,0.4)",
                            borderColor: "rgba(75,192,192,1)",
                            borderCapStyle: 'butt',
                            borderDash: [],
                            borderDashOffset: 0.0,
                            borderJoinStyle: 'miter',
                            pointBorderColor: "rgba(75,192,192,1)",
                            pointBackgroundColor: "#fff",
                            pointBorderWidth: 1,
                            pointHoverRadius: 5,
                            pointHoverBackgroundColor: "rgba(75,192,192,1)",
                            pointHoverBorderColor: "rgba(220,220,220,1)",
                            pointHoverBorderWidth: 2,
                            pointRadius: 5,
                            pointHitRadius: 10,
                            data: valor,
                        }
                    ]
                };

                var option = {
                    title: {
                        display: true,
                        fontSize: 20,
                        fontFamily: 'Helvetica',
                        text: 'Reporte Mensual de Ventas'
                    },
                    plugins: {
                        datalabels: {
                            backgroundColor: function (context) {
                                return context.dataset.borderColor;
                            },
                            borderRadius: 4,
                            color: 'white',
                            anchor: 'end',
                            align: 'end',
                        }
                    },
                    showLines: true
                };
            }

            xChart = new Chart(canvas,
                {
                    type: tipGra,
                    data: data,
                    options: option
                });
            flag = 1;
        }
        else {
            $('#grafico').fadeOut('fast');
            $('#graficoMessage').fadeIn('slow');
        }
    } catch (err) {
        console.log(err);
    }
}




我宣布" xChart"作为一个全局变量和一个标志,知道它是否是第一个构建的图表。该示例构建了3种不同类型的图表(垂直条,水平条和线),具体取决于图表类型的选择" let tipGra =" $('#slcTipGra')。val ();"