Я хотел бы отображать одну и ту же диаграмму (конечно, с разными данными и метками) в цикле. На данный момент у меня есть:
<tbody>
{% for key, value in game_details.items %}
<tr>
<td>{{ key }}</td>
<td>{{ value.all }}</td>
<td>{{ value.win }}</td>
<td>{{ value.lost }}</td>
</tr>
<tr>
<td>
<canvas id="myChart" width="400" height="400"></canvas>
<script>
const ctx = document.getElementById('myChart').getContext('2d');
const myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
</td>
</tr>
{% endfor %}
</tbody>
Отображается первая диаграмма, но когда я смотрю в консоль, я вижу: Uncaught SyntaxError: Identifier 'ctx' has already been declared (at (index):179:29)
. Поэтому мой цикл не может создать другую диаграмму, потому что ctx
уже объявлен. Моя цель - отображать диаграмму для каждой итерации по словарю. Я смотрел на этот сообщение, но это не единственная моя проблема. Как я могу сделать это правильно?
Создайте свой идентификатор холста и эти имена констант JavaScript с помощью индекс петли loop.index
:
Например:
{% for key, value in game_details.items %}
<canvas id="myChart{{ loop.index }}" width="400" height="400"></canvas>
<script>
const ctx{{ loop.index }} = document.
getElementById('myChart{{ loop.index }}').
getContext('2d');
const myChart{{ loop.index }} = new Chart(ctx{{ loop.index }}, {
type: 'pie',
data: {
labels: ['Win', 'Lost'],
datasets: [{
label: '# of Votes',
data: [{{ value.win }}, {{ value.lost }}],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
'rgba(54, 162, 235, 0.2)',
],
borderColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
],
borderWidth: 1
}]
},
options: {
scales: {
y: {
beginAtZero: true
}
}
}
});
</script>
{% endfor %}
Проверьте сгенерированный исходный код и убедитесь, что в нем нет лишнего места и что константы в порядке ctx1
, ctx2
, ctx3
, ... то же самое для идентификатора холста, другой константы JS и т. д.
Проблема решена. Одна из моих игр называлась ping-pong
. Изменение его на pingpong
решило проблему, и все графики отображаются
У меня странное взаимодействие. Когда я добавляю
{{ loop.index }}
в 5 местах (id, ctx, getElementById, myChart и новый график), ничего не меняется. Отображается только 1 график. Но когда я меняю{{ loop.index }}
на{{ key }}
, первая диаграмма не отображается, а другие