Диаграммы Chart.js v2 не отображаются внутри угловых 2 (но Chart.js v1 работает отлично)
Я отображаю диаграмму в директиве атрибута angular2 (подход, принятый командой angular2). Этот подход работает с chart.js, но не с chart.js 2.x
Код для директивы атрибута...
import {Directive, ElementRef, Input} from '@angular/core';
declare var Chart:any;
@Directive({
selector: '[bargraph]'
})
export class BarGraphDirective {
el:any;
myChart:any;
constructor(element:ElementRef) {
this.el = element.nativeElement;
}
ngAfterViewInit() {
var canvas = this.el;
var ctx = canvas.getContext('2d');
var _data = {
labels: ["01-01",
"01-04",
"01-15",
"02-03",
"03-25",
"04-03",
"04-14",
"05-27",
"05-27",
"08-03"],
datasets: [{
data: [5, 13, 23, 20, 5, 13, 23, 20, 110, 2],
label: "female",
borderColor: "rgba(197,23,1,0.8)",
backgroundColor: "rgba(197,23,1,0.4)",
hoverBackgroundColor: "rgba(197,23,1,1)",
borderWidth: 1,
pointBorderColor: "rgba(197,23,1,1)",
pointBackgroundColor: "rgba(255,255,255,0.8)",
pointBorderWidth: 1.5,
tension: -1,
yAxisID: "y-axis-1",
}, ],
};
var _options = {
scales: {
xAxes: [{
categorySpacing: 0
}],
yAxes: [{
type: "linear",
display: true,
position: "left",
id: "y-axis-1",
}]
}
};
this.myChart = new Chart(ctx, {
type: "line",
data: _data,
options: _options
});
console.log(ctx);
console.log(this.myChart);
}
}
стиль это...
canvas[bargraph] {
height: 400px !important;
width: 700px !important;
}
компонент, использующий это, имеет...
<canvas bargraph width="700" height="400"></canvas>
в шаблоне.
все как и ожидалось. Операторы console.log показывают, что ctx и this.myChart определены в хуке жизненного цикла ngAfterViewInit. Там нет ошибок. График просто не отображается.
PS Код Chart.js v2 отлично работает за пределами Angular2, как показано на этой скрипте JS - http://jsfiddle.net/beehe4eg/
Единственная разница между JS Fiddle и моим кодом заключается в подключении к DOM ...
document.getElementById("barChart") // for the fiddle
element.nativeElement // in my code as per the approach in the angular 2 docs
Документы для директивы атрибутов и особенно для ловушки DOM ... https://angular.io/docs/ts/latest/guide/attribute-directives.html
Хук element.nativeElement отлично работает для chart.js v1 с angular2 (используя идентичный подход).
Обратите внимание, что github repo... https://github.com/valor-software/ng2-charts использует chart.js v1, так что это не поможет
Надеясь, что кто-то там может знать решение или может это исправить! Заранее спасибо.
2 ответа
Сегодня текущая версия 2.1.0. API имеет изменения. Версия 2.0-alpha была выпущена 5 июня 2015 года. https://github.com/chartjs/Chart.js/releases/tag/v2.0-alpha Версия, которую вы используете в jsfiddle: 2.0.0-alpha4 (22 июня 2015 г. hash 9368c6079d989527dcd2072b6f18780b53e3113c)
Вы должны изменить свой код, как описано ниже:
this.myChart = new Chart(ctx).Line({
data: _data,
options: _options
});
См. Рабочий пример с диаграммой v2.0-alpha https://plnkr.co/edit/IFdEeMcS9lHGWrsUwkGb?p=preview
Если вы используете синтаксис 2.1.3, вы можете написать так:
this.myChart = new Chart(ctx, {
type: 'line',
data: _data,
options: _options
});
Пример с v2.1.3 https://plnkr.co/edit/GubwdD9Voo3mBPYYKEEL?p=preview
Родитель элемента canvas ДОЛЖЕН быть допустимым элементом HTML, он не может быть тегом компонента Angular2, например my-app
,
Так что это не работает при использовании Chart.js:
<my-chart-component>
<canvas></canvas>
</my-chart-component>
Это работает:
<div>
<canvas></canvas>
</div>
Не уверен, что это твоя проблема.