Angular2アプリケーションにGoogle Chartを統合したい。これを行う方法は何ですか?利用可能な例はありますか?
Google Chartsがデモされるようにパッケージをロードしようとしましたが、ロードに問題がありました。 angular2-google-chart ...を試しましたが、うまく機能しませんでした。
ご協力いただきありがとうございます。
ここで私はそれを解決した方法です。
import { Component} from '@angular/core';
import { GoogleChartComponent} from './ChartComponent.js';
@Component({
selector: 'evolution',
template: `
<div class="four wide column center aligned">
<div id="chart_divEvolution" style="width: 900px; height: 500px;"></div>
</div>
`
})
export class EvolutionComponent extends GoogleChartComponent {
private options;
private data;
private chart;
constructor(){
console.log("Here is EvolutionComponent")
}
drawGraph(){
console.log("DrawGraph Evolution...");
this.data = this.createDataTable([
['Evolution', 'Imports', 'Exports'],
['A', 8695000, 6422800],
['B', 3792000, 3694000],
['C', 8175000, 800800]
]);
this.options = {
title: 'Evolution, 2014',
chartArea: {width: '50%'},
hAxis: {
title: 'Value in USD',
minValue: 0
},
vAxis: {
title: 'Members'
}
};
this.chart = this.createBarChart(document.getElementById('chart_divEvolution'));
this.chart.draw(this.data, this.options);
}
}
import { Component, OnInit} from '@angular/core';
declare var google:any;
@Component({
selector: 'chart'
})
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: ['corechart', '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);
}
}
これで、これをindex.htmlに追加するだけです。
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
_//in index.html add
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
_
Googleサーバーからアプリに33.5KBが読み込まれました。
今追加します
_declare var google:any;
_
あなたのコンポーネントにあなたのグーグルチャートコードをngOnInitに追加してください。
_import { Component, OnInit } from '@angular/core';
declare var google:any;
@Component({
selector: 'app-charts',
templateUrl: './charts.component.html',
styleUrls: ['./charts.component.css']
})
export class ChartsComponent implements OnInit {
constructor() {
}
ngOnInit() {
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Task', 'Hours per Day'],
['Work', 11],
['Eat', 2],
['Commute', 2],
['Watch TV', 2],
['Sleep', 7]
]);
var options = {
title: 'My Daily Activities'
};
var chart = new google.visualization.PieChart(document.getElementById('piechart'));
chart.draw(data, options);
}
}
}
_
「corechart」が読み込まれると、追加の35.8KBがgoogleサーバーから読み込まれます。
これをコンポーネントのhtmlに追加します
_<div id="piechart" style="width: 900px; height: 500px;"></div>
_
より良いアプローチは、コンポーネントtsファイルでdocument.getElementById('piechart')
の代わりにViewChildを使用することです。
このソリューションは、ルーティングを使用している場合に適しています。コンポーネントに挿入できるResolver
オブジェクトを初期化して解決するgoogle
を作成できます。
最初に、以下の行をindex.htmlの最後に追加する必要があります
// index.html
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
次に、Resolver
という名前のGoogleChartResolver
という名前を作成する必要があります。
// shared/google-chart.resolver.ts
declare const google: any;
@Injectable()
export class GoogleChartResolver implements Resolve<any>{
private static googleChartLoaded: boolean = false;
constructor() {}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if(GoogleChartResolver.googleChartLoaded){
return Observable.of(google);
} else {
return Observable.create(function (observer: Observer<any>) {
google.charts.load('current', {packages: ['corechart', 'bar']});
google.charts.setOnLoadCallback(() => {
observer.next(google);
observer.complete();
GoogleChartResolver.googleChartLoaded = true;
});
});
}
}
}
google
のインスタンスが必要なすべてのルートとコンポーネントについて、以下の行を追加できます。ルートで解決するオブザーバブルのリストにGoogleChartResolver
を追加する必要があります。
// app-routing.module.ts
{path: 'my-path', component: MyComponent, resolve: {google: GoogleChartResolver}}
MyComponent
では、ActivatedRoute
をinejctして、スナップショットからgoogle
のインスタンスを取得できます
// my.component.ts
private google: any;
constructor(private route: ActivatedRoute) {}
ngOnInit() {
this.google = this.route.snapshot.data.google;
drawChart(this.google)
}
Googleチャートのすべての依存リソースは、リゾルバーを初めて解決しようとしたときにロードされます(ここでは、/my-path
に初めてアクセスしたとき)。その後の解決では、既に解決されたオブジェクトが返されます(リソースのフェッチは必要ありません)。また、このアプローチは、すべてのチャートパッケージを一度にロードします。さらに最適化する必要がある場合は、さまざまなリゾルバーを使用してさまざまなチャートパッケージをロードできますが、それはやり過ぎかもしれません。これに対する解決策は、Resolver
クラスを作成する代わりに、ルートresolve
メソッド参照を使用した機能(たとえば、同じことを行うサービスで静的メソッドを作成します)。
使用するようなコンポーネントを求めている場合は、以下のng2-google-chartsを参照してください。 https://www.npmjs.com/package/ng2-google-charts 。内部的には、loader.js googleライブラリを使用してライブラリをレンダリングします。入力を介してチャートの構成を使用できます。