#javascript #django #django-templates #chart.js
#javascript #django #django-шаблоны #chart.js
Вопрос:
Я пытался построить несколько пончиковых графиков с помощью Django и ChartJS. Но застрял в проблеме. Когда данные имеют значение = 0, я хочу, чтобы вывод вместо пончика был «Нет данных».
Я исследовал ngIf, но результат не соответствует ожиданиям. Вот мой код
index.html
<div class="card-body card-body-cascade text-center"><div class="chartjs-size-monitor" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px; overflow: hidden; pointer-events: none; visibility: hidden; z-index: -1;"><div class="chartjs-size-monitor-expand" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;">
<div style="position:absolute;width:1000000px;height:1000000px;left:0;top:0"></div></div><div class="chartjs-size-monitor-shrink" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;">
<div style="position:absolute;width:200%;height:200%;left:0; top:0"></div></div></div>
<canvas id="doughnutChart" height="250" width="730" class="chartjs-render-monitor" style="display: block; width: 408px; height: 272px;" ng-if="data.length <= 0"></canvas>
<span ng-if="data == 0">No data</span>
</div>
И JS для пончика выглядит так
<script>
chartIt();
async function chartIt() {
const data = await getData();
var ctx = document.getElementById("doughnutChart").getContext('2d');
var myLineChart = new Chart(ctx, {
type: 'doughnut',
data: {
labels: ['d1','d2'],
datasets: [{
data: ['0','0'],
backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
}]
},
options: {
responsive: true
}
});
}
</script>
Ответ №1:
API ядра плагина предлагает ряд перехватов, которые могут использоваться для выполнения пользовательского кода. Вы можете использовать afterDraw
хук для записи текста «Нет данных» непосредственно на холсте, используя CanvasRenderingContext2D
в случае sum
, если все data
значения равны нулю.
Пожалуйста, взгляните на ваш исправленный код и посмотрите, как он работает.
new Chart('doughnutChart', {
type: 'doughnut',
plugins: [{
afterDraw: function(chart) {
let sum = chart.data.datasets[0].data.map(v => parseInt(v)).reduce((a, b) => a b, 0);
if (sum == 0) {
let width = chart.chart.width,
height = chart.chart.height 35,
ctx = chart.chart.ctx;
ctx.save();
let fontSize = (height / 200).toFixed(2);
ctx.font = fontSize "em sans-serif";
ctx.textBaseline = "middle";
let text = 'No Data',
textX = Math.round((width - ctx.measureText(text).width) / 2),
textY = height / 2;
ctx.fillText(text, textX, textY);
ctx.restore();
}
}
}],
data: {
labels: ['d1', 'd2'],
datasets: [{
data: ['0', '0'],
backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
}]
},
options: {
responsive: true
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
<canvas id="doughnutChart" height="80"></canvas>