许多 Flots 使用 ChartJS 和 Ajax 获取数据值

Many Flots using ChartJS and Ajax get data values

我正在使用 ChartJS 制作图表,我在同一页面上有多个图表。所有这些都已成功生成。但是我在控制台上遇到错误,指示 ChartJS 中的错误。

当我在页面上只留下 1 个图形时,它不会在控制台上显示错误,但是,如果我再放 1 个,就会在控制台上显示错误。

我已经检查了 HTML,没有 canvas 个元素重复。

我做错了什么?

错误

chart.min.js:13 Uncaught Error: Canvas is already in use. Chart with ID '1' must be destroyed before the canvas can be reused.
at new hn (chart.min.js:13)
at Object.<anonymous> (Dashboard.js:145)
at Function.each (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)
at i.fn.init.each (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)
at Object.success (Dashboard.js:133)
at c (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)
at Object.fireWith [as resolveWith] (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)
at b (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)
at XMLHttpRequest.<anonymous> (js?v=LCTUWYjF9I-Sw3l0P8Zn6_b6478OuizeBkjnoe30Tcc1:1)

HTML

<div class="row">
<div class="col-lg-6">
    <div class="ibox float-e-margins">
        <div class="ibox-title">
            <h5>Matchs dos Últimos Processos Executados</h5>
            <div class="ibox-tools">
                <a class="collapse-link">
                    <i class="fa fa-chevron-up"></i>
                </a>
                <a class="close-link">
                    <i class="fa fa-times"></i>
                </a>
            </div>
        </div>
        <div class="ibox-content">
            <canvas id="ultimosProcessosExecutados" height="170"></canvas>
        </div>
    </div>
</div>
<div class="col-lg-6">
    <div class="ibox float-e-margins">
        <div class="ibox-title">
            <h5>Matchs por Empresa Origem</h5>
            <div class="ibox-tools">
                <a class="collapse-link">
                    <i class="fa fa-chevron-up"></i>
                </a>
                <a class="close-link">
                    <i class="fa fa-times"></i>
                </a>
            </div>
        </div>
        <div class="ibox-content">
            <canvas id="divValorMedioPorEmpresaDeOrigem" height="170"></canvas>
        </div>
    </div>
</div>

JS

$(document).ready(function () {
    VisaoGeralProcessamento();    
    UltimosProcessosExecutados();    
    ValorMedioPorEmpresaDeOrigem();
});

function perc2color(perc) {
    var r, g, b = 0;
    if (perc < 50) {
        r = 255;
        g = Math.round(5.1 * perc);
    }
    else {
        g = 255;
        r = Math.round(510 - 5.10 * perc);
    }
    var h = r * 0x10000 + g * 0x100 + b * 0x1;
    return '#' + ('000000' + h.toString(16)).slice(-6);
}

function UltimosProcessosExecutados() {    
    $.ajax({
        url: '/ProcessoIA/DadosDashboard',
        type: 'GET',
        data: {
            'grafico': ""
        },
        success: function (data) {
            var rotulos = [];
            var dados = [];

            $(data.dados).each(function (index, item) {
                rotulos.push(item.Chave);
                dados.push(item.Valor);
            });

            var chartUltimosProcessosExecutados = document.getElementById('ultimosProcessosExecutados').getContext('2d');
            new Chart(chartUltimosProcessosExecutados, {
                type: 'line',
                data: {
                    labels: rotulos,
                    datasets: [{
                        label: 'Valor Médio dos Matchs (%)',
                        data: dados,
                        borderColor: 'rgb(75, 192, 192)',
                        backgroundColor: 'rgb(75, 192, 192)',
                        tension: 0.1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            suggestedMax: 100
                        }
                    }
                }
            });
        },
        error: function (request, error) {
            alert("Request: " + JSON.stringify(request));
        }
    });
}

function ValorMedioPorEmpresaDeOrigem() {
    $.ajax({
        url: '/ProcessoIA/DadosDashboard',
        type: 'GET',
        data: {
            'grafico': "ValorMedioPorEmpresaDeOrigem",
        },
        success: function (data) {
            $(data.dados).each(function (index, item) {
                var rotulos = [];
                var dados = [];
                var coresDeFundo = [];

                $(data.dados).each(function (index, item) {
                    rotulos.push(item.Chave);
                    dados.push(item.Valor);
                    coresDeFundo.push(perc2color(item.Valor));
                });

                var chartValorMedioPorEmpresaDeOrigem = document.getElementById('divValorMedioPorEmpresaDeOrigem').getContext('2d');
                new Chart(chartValorMedioPorEmpresaDeOrigem, {
                    type: 'bar',
                    data: {
                        labels: rotulos,
                        datasets: [{
                            label: 'Valor Médio dos Matchs (%)',
                            data: dados,
                            borderColor: coresDeFundo,
                            backgroundColor: coresDeFundo,
                            tension: 0.1
                        }]
                    }
                });
            });
        },
        error: function (request, error) {
            alert("Request: " + JSON.stringify(request));
        }
    });
};

您必须为 AJAX 中的每个调用重新创建 canvas,尝试销毁 canvas 并为每个调用创建它

    $(document).ready(function () {
        VisaoGeralProcessamento();    
        UltimosProcessosExecutados();    
        ValorMedioPorEmpresaDeOrigem();
    });
    
    let chart1;
    let chart2;

    function perc2color(perc) {
        var r, g, b = 0;
        if (perc < 50) {
            r = 255;
            g = Math.round(5.1 * perc);
        }
        else {
            g = 255;
            r = Math.round(510 - 5.10 * perc);
        }
        var h = r * 0x10000 + g * 0x100 + b * 0x1;
        return '#' + ('000000' + h.toString(16)).slice(-6);
    }
    
    function UltimosProcessosExecutados() {    
        $.ajax({
            url: '/ProcessoIA/DadosDashboard',
            type: 'GET',
            data: {
                'grafico': ""
            },
            success: function (data) {
                var rotulos = [];
                var dados = [];
    
                $(data.dados).each(function (index, item) {
                    rotulos.push(item.Chave);
                    dados.push(item.Valor);
                });
    
                var chartUltimosProcessosExecutados = document.getElementById('ultimosProcessosExecutados').getContext('2d');
                    if (chart1) {
                        chart1.destroy();
                    }
                chart1 = new Chart(chartUltimosProcessosExecutados, {
                    type: 'line',
                    data: {
                        labels: rotulos,
                        datasets: [{
                            label: 'Valor Médio dos Matchs (%)',
                            data: dados,
                            borderColor: 'rgb(75, 192, 192)',
                            backgroundColor: 'rgb(75, 192, 192)',
                            tension: 0.1
                        }]
                    },
                    options: {
                        scales: {
                            y: {
                                suggestedMax: 100
                            }
                        }
                    }
                });
            },
            error: function (request, error) {
                alert("Request: " + JSON.stringify(request));
            }
        });
    }
    
    function ValorMedioPorEmpresaDeOrigem() {
        $.ajax({
            url: '/ProcessoIA/DadosDashboard',
            type: 'GET',
            data: {
                'grafico': "ValorMedioPorEmpresaDeOrigem",
            },
            success: function (data) {
                $(data.dados).each(function (index, item) {
                    var rotulos = [];
                    var dados = [];
                    var coresDeFundo = [];
    
                    $(data.dados).each(function (index, item) {
                        rotulos.push(item.Chave);
                        dados.push(item.Valor);
                        coresDeFundo.push(perc2color(item.Valor));
                    });
    
                    var chartValorMedioPorEmpresaDeOrigem = document.getElementById('divValorMedioPorEmpresaDeOrigem').getContext('2d');
                    if (chart2) {
                        chart2.destroy();
                    }

                    chart2 = new Chart(chartValorMedioPorEmpresaDeOrigem, {
                        type: 'bar',
                        data: {
                            labels: rotulos,
                            datasets: [{
                                label: 'Valor Médio dos Matchs (%)',
                                data: dados,
                                borderColor: coresDeFundo,
                                backgroundColor: coresDeFundo,
                                tension: 0.1
                            }]
                        }
                    });
                });
            },
            error: function (request, error) {
                alert("Request: " + JSON.stringify(request));
            }
        });
    };