2017-03-19 1 views
1

Punkrで親から子コンポーネントビューを更新することができません:私は私の親コンポーネントアプリでchartist charts角度2

をレンダリングするために使用していた子カンプchartist.componentをしましたHere

.TS、私は折れ線グラフと親コンプバーチャート

をレンダリングするために二回chartist.componentを呼び出しています、私は、折れ線グラフのANをリフレッシュするためのボタンをしましたd棒グラフはデータ変数内のデータを変更し、子変数に渡してグラフを描画します。

私の問題は、チャートが更新ボタンをクリックして1回だけ更新されていることです。データオブジェクトが変更されるたびにグラフを更新したいと思います。

app.ts(親COMP):

import {Component, NgModule, OnInit, AfterViewInit} from '@angular/core' 
import {BrowserModule} from '@angular/platform-browser' 
import {ChartistChart} from './chartist.component' 

@Component({ 
    selector: 'my-app', 
    templateUrl: './src/app.html',, 
}) 
export class App implements OnInit, AfterViewInit { 
    name:string; 
    data: any; 
    isFirst:true; 
    dataIndex:number; 
    allData:any; 

    constructor() { 
    this.name = 'Angular2' 
    this.dataIndex=0; 
    this.allData=[{chart data1},{chart data 2}]; 
    } 

    ngOnInit() { 
    this.getAllCharts(); 
    } 

    ngAfterViewInit() {} 

    public getAllCharts(){ 
    this.data= this.allData[this.dataIndex]; 
    return this.allData[this.dataIndex]; 
    } 

    public updateLineChart(){ 
    this.isFirst = !this.isFirst; 
    this.dataIndex = this.isFirst?0:1; 
    this.data.simpleLineData = this.allData[this.dataIndex].simpleLineData; 
    this.data.simpleLineOptions = this.allData[this.dataIndex].simpleLineOptions; 
    } 

    public updateBarChart(){ 
    this.isFirst = !this.isFirst; 
    this.dataIndex = this.isFirst?0:1; 
    this.data.simpleBarData = this.allData[this.dataIndex].simpleBarData; 
    this.data.simpleBarOptions = this.allData[this.dataIndex].simpleBarOptions; 
    } 
} 

@NgModule({ 
    imports: [ BrowserModule ], 
    declarations: [ App, ChartistChart ], 
    bootstrap: [ App ] 
}) 
export class AppModule {} 

app.html:

<div style="width:100%; height:350px"> 
    <button (click)="updateLineChart()">Update Line chart</button> DataIndex: {{dataIndex}} 
    <chartist-chart *ngIf="data" chartistChartClass="ct-chart" chartistChartType="Line" [chartistChartData]="data['simpleLineData']" 
       [chartistChartOptions]="data['simpleLineOptions']"> 
      </chartist-chart> 
    </div> 
      <br/> <br/>  
    <div style="width:100%; height:350px"> 
    <button (click)="updateBarChart()">Update Bar chart</button> DataIndex: {{dataIndex}} 
     <chartist-chart *ngIf="data" chartistChartClass="ct-chart" chartistChartType="Bar" [chartistChartData]="data['simpleBarData']" 
       [chartistChartOptions]="data['simpleBarOptions']"> 
      </chartist-chart> 
    </div> 

chartist.component.ts(子):

import { 
    Component, ViewChild, Input, Output, ElementRef, EventEmitter, ChangeDetectorRef 
} from '@angular/core'; 



@Component({ 
    selector: 'chartist-chart', 
    templateUrl: './src/chartistChart.html', 
    providers: [], 
}) 
export class ChartistChart { 

    @Input() chartistChartType: string; 
    @Input() chartistChartData: Object; 
    @Input() chartistChartOptions: Object; 
    @Input() chartistChartResponsive: Object; 
    @Input() chartistChartClass: string; 
    @Output() onChartReady = new EventEmitter<any>(); 

    @ViewChild('chartistChart') public _selector: ElementRef; 

    private chart; 
    constructor(private cdr: ChangeDetectorRef){} 

    ngAfterViewInit() { 
    console.log('chart init', this.chartistChartData) 
    let _self = this; 
    _self.chart = new Chartist[_self.chartistChartType](_self._selector.nativeElement, 
     _self.chartistChartData, 
     _self.chartistChartOptions); 

    _self.onChartReady.emit(_self.chart); 
    this.cdr.detectChanges(); 
    } 



    ngOnChanges(changes) { 
    if (this.chart) { 
     console.log('chartistChartData changed: ',this.chartistChartData); 
     (<any>this.chart).update(this.chartistChartData, this.chartistChartOptions); 
    } 
    } 

    ngOnDestroy(): void { 
    if (this.chart) { 
     this.chart.detach(); 
    } 
    } 
} 

chartistChart.html:

<div #chartistChart class="{{chartistChartClass || ''}}"></div> 

答えて

1

あなたはthis.dataは、新しいデータ系列に再割り当てされるように、手動ですべてのボタンのクリックでthis.getAllCharts()を呼び出すするだけです:

public updateLineChart() { 
    this.dataIndex = this.dataIndex ? 0 : 1; 
    this.getAllCharts(); 
} 

public updateBarChart() { 
    this.dataIndex = this.dataIndex ? 0 : 1; 
    this.getAllCharts(); 
} 

あなたはまた、取り除くことができます冗長isFirstフラグ、dataIndexで十分です。また、this.data.simpleBarDatathis.data.simpleLineDataを手動で設定する必要はありません。これはすでにテンプレートの小道具として渡されているためです。

デモ:https://plnkr.co/edit/1eyTe5WYFAjL9ssRgdiS?p=preview