angular 4アプリケーションにグーグルチャートをどのように統合しますか?
SO質問 ここ の答えを読みましたが、不完全だと思います。基本的には、GoogleChartComponentと2つのエラーが発生します。1つ目は子コンポーネントのsuper()の呼び出しの欠落で、2つ目はこのコードでの「new」の呼び出しです
createBarChart(element: any): any {
return new google.visualization.BarChart(element);
}
「google.visualization.BarChartはコンストラクタではありません」というエラーが表示されます。
コメントの1つには、データ投影に<ng-content>
を使用することも記載されていますが、明確に概説されていません。
「良い」質問をしようとすると、ここに私のGoogleChartComponentがあります:
export class GoogleChartComponent implements OnInit {
private static googleLoaded: any;
constructor() {
console.log('Here is GoogleChartComponent');
}
getGoogle() {
return google;
}
ngOnInit() {
console.log('ngOnInit');
if (!GoogleChartComponent.googleLoaded) {
GoogleChartComponent.googleLoaded = true;
google.charts.load('current', {
'packages': ['bar']
});
google.charts.setOnLoadCallback(() => this.drawGraph());
}
}
drawGraph() {
console.log('DrawGraph base class!!!! ');
}
createBarChart(element: any): any {
return new google.visualization.BarChart(element);
}
createDataTable(array: any[]): any {
return google.visualization.arrayToDataTable(array);
}
}
そして、それを拡張する私の子コンポーネント:
@Component({
selector: 'app-bitcoin-chart',
template: `
<div id="barchart_material" style="width: 700px; height: 500px;"></div>
`,
styles: []
})
export class BitcoinChartComponent extends GoogleChartComponent {
private options;
private data;
private chart;
// constructor() {
// super();
// console.log('Bitcoin Chart Component');
// }
drawGraph() {
console.log('Drawing Bitcoin Graph');
this.data = this.createDataTable([
['Price', 'Coinbase', 'Bitfinex', 'Poloniex', 'Kraken'],
['*', 1000, 400, 200, 500]
]);
this.options = {
chart: {
title: 'Bitcoin Price',
subtitle: 'Real time price data across exchanges',
},
bars: 'vertical' // Required for Material Bar Charts.
};
this.chart = this.createBarChart(document.getElementById('barchart_material'));
this.chart.draw(this.data, this.options);
}
}
google.visualization.BarChart
は'corechart'
パッケージの一部です
ロード文を変更する必要があります...
google.charts.load('current', {
'packages': ['corechart']
});
'bar'
パッケージは、Materialチャートバージョン用です
これは-> google.charts.Bar
ただし、Materialチャートではサポートされていない多くの設定オプションがあります...
サポートされていないオプションの完全なリストについては-> マテリアルチャート機能のパリティの追跡問題
Google ChartをAngular 4に統合するより良い方法があると思います。ライブラリ ng2-google-charts には既にGoogleChartComponentがあります。 npmページへのリンクは、それを使用する方法をかなりよく説明しています。コンポーネントの例を次に示します。
import {Component, ViewEncapsulation, OnInit} from '@angular/core';
import {Component, ViewEncapsulation, OnInit} from '@angular/core';
import {Component, ViewEncapsulation, OnInit} from '@angular/core';
import {ViewChild} from '@angular/core';
import {GoogleChartComponent} from 'ng2-google-charts';
// needed for advanced usage of ng2-google-charts
import {HostListener} from '@angular/core';
@Component({
selector: '[your-widget]',
templateUrl: './your-widget.html',
encapsulation: ViewEncapsulation.None
})
export class YourWidget implements OnInit {
// type GoogleChartComponent and import for it can be ommited
@ViewChild('your_chart') chart: GoogleChartComponent;
// shows spinner while data is loading
showSpinner: boolean;
public chartData = {
chartType: 'AnyChartType', // your type
dataTable: [
['Col1', 'Col2']
],
options: {}
};
constructor() {
}
ngOnInit(): void {
this.showSpinner = true;
this.yourService.getData()
.subscribe((data) => {
//this.data = data;
this.processYourData();
this.showSpinner = false;
});
}
private processYourData() {
}
// advanced usage of chart
// in this case redraw function on window:resize event
@HostListener('window:resize', ['$event'])
onWindowResize(event: any) {
// console.log(event.target.innerWidth);
// Make sure you don't call redraw() in ngOnInit()
// - chart would not be initialised by that time, and
// - this would cause chart being drawn twice
this.chart.redraw();
}
}
そして、マークアップは次のようになります。
<header class="widget-handle">
<h5>Widget Title</h5>
<div class="widget-controls">
<a title="Refresh">
<i *ngIf="showSpinner" class="fa fa-refresh fa-spin"></i>
</a>
</div>
</header>
<div class="widget-body">
<google-chart #your_chart [data]="chartData" *ngIf="!showSpinner">
</google-chart>
</div>