2017-09-24 19 views
1

HTMLファイル更新チャートJSチャート

私はchart.jsを更新するには、この私がgetTankDataを使用しています.INページのリロードなしにすべての10秒後にグラフを生成しました()バックエンドからのすべてのデータを取得し、グラフ要素を更新するが、私はページをリロードするまでグラフは更新されていない。しかし、私はリロードせずに自動的に更新したい。

<div class="container"> 

    <div class="row"> 
    <div class="col-md-3"> 
     <h2>User Water Graph</h2> 

    </div> 
     <div class="col-md-9"> 
     <div style="display: block;"> 
     <canvas id="myChart" baseChart *ngIf="time_data && water_data.length > 0" 
      width="700" height="400" 
        [datasets]="lineChartData" 
        [labels]="lineChartLabels" 
        [options]="lineChartOptions" 
        [colors]="lineChartColors" 
        [legend]="lineChartLegend" 
        [chartType]="lineChartType"></canvas> 
     </div> 
     </div> 

    </div> 
    </div> 

typescriptファイルあなたはgetTankDataごとに10秒を呼び出している

import { Component, OnInit } from '@angular/core'; 
import {AuthService} from '../../services/auth.service'; 
import {Router} from '@angular/router'; 
import {FlashMessagesService} from 'angular2-flash-messages'; 


@Component({ 
    selector: 'app-admin-dashboard', 
    templateUrl: './admin-dashboard.component.html', 
    styleUrls: ['./admin-dashboard.component.css'] 
}) 
export class AdminDashboardComponent implements OnInit { 
    total_tank_data:any; 
    time_data:Array<any>; 
    water_data:Array<any>; 
    lineChartData:Array<any> = [] 
    lineChartLabels:Array<any> 
    lineChartOptions:any 
    lineChartColors:Array<any> 
    lineChartLegend:boolean 
    lineChartType:string 
    data_length:any 

    constructor(
    private authService:AuthService,  
    private flashMessage:FlashMessagesService, 
    private router:Router,) { } 

    ngOnInit() { 

    this.getTankData() 
    if(localStorage.getItem('type')=='user'){ 
     this.authService.userAccess = true 
    } 
    else{ 
     this.authService.adminAccess = true 
    } 

    } 


    getTankData(){ 
    var i; 
    console.log(document.getElementById('chart')); 
    this.authService.getTank().subscribe(data=>{ 
     this.time_data = []; 
     this.water_data = []; 
     this.total_tank_data = []; 
     this.total_tank_data = data['tank']; 
     this.lineChartData = []; 
     this.lineChartLabels = []; 
     for(i=0;i<this.total_tank_data.length;i++){ 
     this.time_data[i] = String(this.total_tank_data[i]['timestamp']); 
     this.water_data[i]=parseInt(this.total_tank_data[i]['liters']); 
     } 

     this.lineChartData=[ 
     {data: this.water_data, label: 'Tank'} 
     ]; 

     this.lineChartLabels= this.time_data; 

     console.log(this.lineChartLabels) 
     this.lineChartOptions= { 
     responsive: true 
     }; 
     this.lineChartColors = [ 
     { // grey 
      backgroundColor: 'rgba(64,164,223,0.6)', 
      borderColor: 'rgba(148,159,177,1)', 
      pointBackgroundColor: 'rgba(148,159,177,1)', 
      pointBorderColor: '#fff', 
      pointHoverBackgroundColor: '#fff', 
      pointHoverBorderColor: 'rgba(148,159,177,0.8)' 
     }, 

     ]; 
     this.lineChartLegend= true; 
     this.lineChartType= 'line'; 
     this.data_length = this.total_tank_data.length; 


    }); 
setInterval(()=>{ 
this.getTankData(); 
location.reload() 
},10000); 
    } 


} 

答えて

1

あなたの配列は、あなたが呼ばれる関数を形成削除し、あなたの空を開始してください最初の配列。私について

ngOnInit(){ 
this.time_data = []; 
this.water_data = []; 
} 
0

あなたtypescriptファイルににこれを追加:新しいデータがloop.soを完了する前に、フォームのバックエンドに到着しながら、あなたの空の配列を常に提示され

import { ChangeDetectorRef } from '@angular/core'; 


constructor(private ref: ChangeDetectorRef){} 

ngOnInit(){ 

    //Call it every 10 seconds 
    setInterval(this.getTankData(), 10000); 
} 



//add an change detector at the end of your getTankData function 

    getTankData(){ 
    ... 
    this.ref.detectChanges(); 
    } 
+0

チェックは、すべて10秒 –

+0

は、あなたのコードは、現在それを更新するために、ページをリロード私のコードとしてページをリロードせずに、グラフを更新することができると思い –

+0

あなたはせずにビューを更新することができなかった後に呼び出すためのコードを編集しましたページをリロードする ref.detectChangesは、 https://angular.io/api/core/ChangeDetectorRef –

関連する問題