使用chart.js将JSON数据显示到饼图中

时间:2016-10-18 17:03:51

标签: json ajax charts chart.js

我第一次使用chart.js并遇到一个小错误,我似乎无法解决它。下面是我的代码,但它只显示标签但不渲染饼图本身。

以下来自chart.js文档的示例http://www.chartjs.org/docs/#doughnut-pie-chart-example-usage

我们将不胜感激。

<canvas id="myChart" width="200" height="200"></canvas>

 $(document).ready(function () {
 /*
         -> #47A508 = green (wins)
         -> #ff6a00 = orange (losses)
         -> #ffd800 = yellow (draws)
    */
    var DataArray = [];
    var ctx = document.getElementById("myChart");

    $.ajax({
        url: 'http://api.football-data.org/v1/competitions/426/leagueTable',
        dataType: 'json',
        type: 'GET',
    }).done(function (result) {
        $.each(result.standing, function () {
            var name = "Manchester United FC";
            if (this.teamName == name) {
                DataArray.push([this.wins, this.losses, this.draws]);
            }
        });
        var myChart = new Chart(ctx, {
            type: 'pie',
            data: {
                label: 'Manchester United Current Form',
                labels: [
                        "Wins",
                        "Losses",
                        "Draws"
                ],
                datasets: [
                    {
                        data: DataArray,
                        backgroundColor: [
                            "#47A508",
                            "#ff6a00",
                            "#ffd800"
                        ],
                        hoverBackgroundColor: [
                            "#FF6384",
                            "#36A2EB",
                            "#FFCE56"
                        ]
                    }]
            },
            options: { responsive: true }
        });
    });
 }

4 个答案:

答案 0 :(得分:0)

也许是因为每个jquery,当你想将它用作图表数据时,它填充DataArray异步并且数组没有准备好。 将$ .each更改为简单的js for循环

for(var i = 0; i < result.standing; i++){
   var name = "Manchester United FC";
   var team = result.standing[i];
       if (team.teamName == name) {
          DataArray.push(team.wins, team.losses, team.draws);
       }
}

答案 1 :(得分:0)

为你ajax尝试callbacks或执行以下操作(这是一个肮脏的解决方案):

 $.ajax({
        url: 'http://api.football-data.org/v1/competitions/426/leagueTable',
        dataType: 'json',
        cache: false, //add this
        async: false, //add this
        type: 'GET',

另外    你可以使用下面的代码返回你的ajax的结果,而不是使用数组。

jQuery.parseJSON(result); 

答案 2 :(得分:0)

问题在于您的DataArray。它的实现方式是一个包含单个条目的数组。这是另一个阵列本身。

[[<wins>, <losses>, <draws>]]

而不是

[<wins>, <losses>, <draws>]

这是因为你实例化了一个数组,然后将数组对象推入其中。

要解决此问题,请尝试使用以下函数:

(...)
$.each(result.standing, function () {
    var name = "Manchester United FC";
    if (this.teamName == name) {
        DataArray = ([this.wins, this.losses, this.draws]);
        console.log("This team name");
    }
});
(...)

答案 3 :(得分:0)

我得到了解决,很遗憾,没有任何魔法可以吹嘘。最初的代码没有任何问题,但是,这是DOM渲染性能的问题。感谢@alwaysVBNET和@Aniko Litvanyi的投入。

link帮助了我,希望它对那里的某人有所帮助。