#json #ajax #charts #chart.js
#json #ajax #Диаграммы #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 }
});
});
}
Ответ №1:
возможно, это из-за jquery each, он заполняет массив данных асинхронно, и массив не готов, когда вы хотите использовать его в качестве данных диаграммы. Измените $.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. Я только что попробовал это, но диаграмма все еще не отображается. Если возможно, можете ли вы предоставить для этого рабочий jsfiddle. Спасибо.
2. Есть ли какие-либо сообщения об ошибках на консоли панели инструментов разработчика?
3. Несколько ошибок, которые я видел, были частью некоторых rss-каналов, которые я пытаюсь добавить на свою страницу, но не связаны с диаграммой. С тех пор я их очистил, но они все еще не отображаются. Холст занимает пространство (ширина и высота), которое я выделил, но он просто не отображает саму круговую диаграмму.
4. Я отредактировал свой ответ выше, проверьте часть push. Данные должны представлять собой массив чисел, но ранее (и в вашем коде) это был массив массивов.
5. Похоже, ошибка при вводе данных json в массив. Я попробовал ваше решение, но как с $.each, так и с циклом for данные помещаются в массив, когда я запускаю отладчик в консоли браузера.
Ответ №2:
попробуйте callbacks
для вас ajax или выполните следующие действия (что является грязным решением):
$.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);
Ответ №3:
Проблема заключается в вашем массиве данных. Способ его реализации — это массив с одной записью. Который сам по себе является другим массивом.
[[<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");
}
});
(...)
Ответ №4:
Я решил эту проблему, к сожалению, без какой-либо магии, которой можно было бы похвастаться. Изначально в коде не было ничего плохого, однако возникла проблема с производительностью рендеринга DOM. Спасибо @alwaysVBNET и @Aniko Litvanyi за ваш вклад.
Эта ссылка помогла мне, надеюсь, это кому-то поможет.