Ich versuche, Chart.js mit Angular 4 zu verwenden. Ich habe ein Beispiel in den Dokumenten von chart.js gesehen, aber es wird ein <script> -Tag verwendet, um das Skript zu ziehen, damit es nicht für die Komponente funktioniert. So habe ich versucht, in Angular zu passen:
TS
export class GraphicsComponent implements OnInit {
ctx = document.getElementById("myChart");
myChart = new Chart(this.ctx, {
type: 'pie',
data: {
labels: ["New", "In Progress", "On Hold"],
datasets: [{
label: '# of Votes',
data: [1,2,3],
backgroundColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: false,
display:true
}
});
constructor() { }
ngOnInit() {
}
}
HTML
<canvas id="myChart" width="700" height="400"></canvas>
Irgendeine Idee, wie ich es schaffen würde?
EDIT: Ich habe meinen Code mit dem Import aktualisiert und erhalte jetzt einen Fehler.
Importcode:
import * as Chart from 'chart.js'
Fehler auf Chrome-Konsole:
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'length' of null
TypeError: Cannot read property 'length' of null
at Object.acquireContext (platform.dom.js:333)
at Chart.construct (core.controller.js:74)
at new Chart (core.js:42)
at new GraphicsComponent (graphics.component.ts:12)
at createClass (core.es5.js:10922)
at createDirectiveInstance (core.es5.js:10756)
at createViewNodes (core.es5.js:12197)
at createRootView (core.es5.js:12092)
at callWithDebugContext (core.es5.js:13475)
at Object.debugCreateRootView [as createRootView] (core.es5.js:12792)
at Object.acquireContext (platform.dom.js:333)
at Chart.construct (core.controller.js:74)
at new Chart (core.js:42)
at new GraphicsComponent (graphics.component.ts:12)
at createClass (core.es5.js:10922)
at createDirectiveInstance (core.es5.js:10756)
at createViewNodes (core.es5.js:12197)
at createRootView (core.es5.js:12092)
at callWithDebugContext (core.es5.js:13475)
at Object.debugCreateRootView [as createRootView] (core.es5.js:12792)
at resolvePromise (zone.js:795)
at resolvePromise (zone.js:766)
at zone.js:844
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:425)
at Object.onInvokeTask (core.es5.js:3881)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
at Zone.webpackJsonp.../../../../zone.js/dist/zone.js.Zone.runTask (zone.js:192)
at drainMicroTaskQueue (zone.js:602)
at <anonymous>
Sie können das Paket zusammen mit den Typen für die vollständige Funktionalität in einer TypeScript-Umgebung wie Angular installieren:
npm install --save chart.js && npm install --save-dev @types/chart.js
In Ihrer Komponente können Sie nun import * as Chart from 'chart.js'
und in Ihrer TypeScript-Umgebung verwenden. Check out dieses Beispiel für Implementierungsmethoden, die TypeScript verwenden.
Da Sie die Leinwand vom DOM abrufen müssen, müssen Sie sicherstellen, dass sie gerendert wird, bevor Sie versuchen, darauf zuzugreifen. Dies kann mit AfterViewInit
erreicht werden.
import { Component, AfterViewInit } from '@angular/core';
export class MyChartComponent implements AfterViewInit {
canvas: any;
ctx: any;
ngAfterViewInit() {
this.canvas = document.getElementById('myChart');
this.ctx = this.canvas.getContext('2d');
let myChart = new Chart(this.ctx, {
type: 'pie',
data: {
labels: ["New", "In Progress", "On Hold"],
datasets: [{
label: '# of Votes',
data: [1,2,3],
backgroundColor: [
'rgba(255, 99, 132, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: false,
display:true
}
});
}
}
In meiner Angular 6.1-Site verwende ich chart.js allein in mgechev/angle-seed .
Zum Zeitpunkt des Schreibens dieser Antwort haben die Entwickler von Chart.js etwas zu tun , um den Export ihrer Mitglieder mit den neueren Standards kompatibel zu machen, sodass Rollups problematisch sein können.
Damit Chart.js 2.7.x nach der Installation des Pakets chart.js
und der Typen @types/chart.js
in diesem Winkel-Seed funktioniert, muss ich nur noch Folgendes tun:
Aktualisieren Sie project.config.ts
, um ROLLUP_NAMED_EXPORTS einzuschließen, damit Rollup ordnungsgemäß funktioniert (wenn Sie ein Rollup verwenden).
this.ROLLUP_NAMED_EXPORTS = [ ...this.ROLLUP_NAMED_EXPORTS, { 'node_modules/chart.js/src/chart.js': ['Chart'] } ];
Aktualisieren Sie project.config.ts
, um weitere Pakete aufzunehmen. Dieser Seed verwendet SystemJS config. Dies kann variieren, wenn Sie etwas anderes verwenden.
// Add packages const additionalPackages: ExtendPackages[] = [ { name: 'chart.js', path: 'node_modules/chart.js/dist/Chart.bundle.min.js' }, ... ];
In Ihrer Komponente
import { Chart } from 'chart.js'; ... export class MyComponent implements OnInit { @ViewChild('myChart') myChartRef: ElementRef; chartObj: Chart; ... }
Laden Sie dann die Diagrammkonfiguration in ngOnInit () gemäß der Chart.js-Dokumentation .
HTML sieht ungefähr so aus:
<div class="chart-container"> <canvas #myChart></canvas> </div>