#angular #canvas #chart.js #ngfor
#угловой #холст #chart.js #ngfor
Вопрос:
Приведенный ниже код можно использовать только для диаграммы, но мне нужно создать несколько диаграмм. Как я могу сделать приведенный ниже код массивом диаграмм и показать их с помощью *ngFor в Canvas.
@ViewChild('pr_chart') chartElementRef: ElementRef;
ngAfterViewInit() {
let ctx = this.chartElementRef.nativeElement;
ctx = ctx.getContext('2d');
this.chart = new Chart(ctx, {
type: 'line',
options: {
legend: {
display: false
},
scales: {
xAxes: [{
display: false
}],
yAxes: [{
display: false
}],
}
},
data: {
labels: [1500, 1600, 1700, 1750, 1800, 1850, 1900, 1950, 1999, 2050],
datasets: [{
data: [86, 378, 106, 306, 507, 111, 133, 221, 783, 5000],
// label: "Africa",
borderColor: '#3bd19c',
fill: false
}]
}
});
}
<canvas #pr_chart></canvas>
Комментарии:
1. Вы пытались использовать
ViewChildren
вместоViewChild
, чтобы получить список совпадающих ссылок вместо одной?2. Я не знаком с этим, не могли бы вы поделиться со мной каким-нибудь примером по этому поводу?
Ответ №1:
Вы можете использовать @ViewChildren
для получения нескольких ссылок <canvas #pr_chart></canvas>
на экземпляры. Я собрал пример, показывающий, как это сделать, используя ваш пример выше: https://stackblitz.com/edit/angular-chartjs-multiple-charts .
По сути, у меня есть массив элементов диаграммы на моем контроллере:
chartData: Chart.ChartData[] = [
{
labels: ['1500', '1600', '1700', '1750', '1800', '1850', '1900', '1950', '1999', '2050'],
datasets: [{
data: [86, 378, 106, 306, 507, 111, 133, 221, 783, 5000],
borderColor: 'red',
fill: false
}]
},
{
labels: ['1500', '1600', '1700', '1750', '1800', '1850', '1900', '1950', '1999', '2050'],
datasets: [{
data: [86, 378, 106, 306, 507, 111, 133, 221, 783, 5000].reverse(),
borderColor: 'blue',
fill: false
}]
}
];
Они используются для отображения нескольких диаграмм в моем шаблоне:
<div *ngFor="let data of chartData" class="chart">
<canvas #pr_chart></canvas>
</div>
Вместо простого захвата одной ссылки с помощью @ViewChild
, вы можете захватить каждый из pr_chart
экземпляров с помощью @ViewChildren
:
@ViewChildren('pr_chart', { read: ElementRef }) chartElementRefs: QueryList<ElementRef>;
Как только у нас будут эти ссылки, мы можем перебирать их, чтобы создать соответствующую диаграмму, используя эту ссылку вместе со связанными данными:
ngAfterViewInit() {
this.charts = this.chartElementRefs.map((chartElementRef, index) => {
const config = Object.assign({}, baseConfig, { data: this.chartData[index] });
return new Chart(chartElementRef.nativeElement, config);
});
}
Поскольку в моем примере я собирался дублировать большую часть конфигурации для каждой из диаграмм, и изменялись только данные, я создал базовую конфигурацию, которая была общей для каждой из диаграмм при ее рендеринге:
const baseConfig: Chart.ChartConfiguration = {
type: 'line',
options: {
responsive: true,
maintainAspectRatio: false,
legend: { display: false },
scales: {
xAxes: [{ display: false }],
yAxes: [{ display: false }],
}
}
};
Комментарии:
1. Несколько диаграмм отлично работают, когда это статические данные, но данные диаграмм добавляются динамически, диаграммы не отображаются