我正在嘗試爲使用angular 2和chart.js(通過ngcharts)的圖表構建一個儀表板。我想有一個圖表陣列,每個圖表通過自定義時間間隔內的http請求進行更新。如何使用interval更新observables數組?
現在我有三個單獨的圖表調用,將數據推送到一個數組。我在遇到下一次迭代時遇到了麻煩 - 如果再次推入陣列,我最終會得到3個圖表。我希望陣列中的訂閱者在間隔發出時使用新數據進行更新。
對於如何正確構造我的用例的組件/服務/ http關係,我有點困惑。我覺得我很接近,但我肯定錯過了一些東西。如何獲取間隔/訂戶關係以映射到視圖並在一個時間間隔內更新現有圖表? 任何幫助將是偉大的!
現在:
服務:
我在這裏實施的時間間隔:
getSingleChartObsinterval(id: number, interval: number) : Observable<Graph> {
return Observable.interval(interval).flatMap(() => this.getSingleChartobs(id));
}
getSingleChartobs(id: number) : Observable<Graph> {
return this.jsonp.get(「api location」)
.map(response => this.extractJsonData(response, id) as Graph)
}
extractJsonData只是採取響應和操縱它與圖表JS工作。它返回一個Graph對象,該對象具有易於使用的屬性。我無法控制API,因此我無法重新配置響應以包含多個圖。
組件:
import { Component } from '@angular/core';
import { ChartsModule } from 'ng2-charts/ng2-charts';
import { ChartService } from './chart.service';
import { Graph } from './graph';
import { OnInit } from '@angular/core';
import { Observable } from 'rxjs/Rx';
@Component({
selector: 'ab-chart',
styles: [`
.chart {
display: block;
}
`],
templateUrl: 'app/chart.component.html'
})
export class ChartComponent implements OnInit {
ngOnInit(): void {
console.log("Chart component init");
this.getSingleChart(3, 5000);
this.getSingleChart(5, 4000);
this.getSingleChart(6, 5000);
}
graph: Graph;
graphs: Graph[] = [];
constructor(
private chartService: ChartService
) {}
getSingleChart(id: number, interval: number): void {
this.chartService.getSingleChartObsinterval(id, interval)
.subscribe(x =>
this.graphs.push(x)
);
}
}
的觀點:
<div *ngFor="let graph of graphs" class="chart-container">
<base-chart
class="chart"
[datasets]="graph.datasets"
[labels]="graph.labels"
[options]="graph.options"
[chartType]="graph.type">
</base-chart>
</div>
而不是推新圖表在你的數組中,你不能只用新的數據替換現有的圖表嗎?我對chart.js一無所知,所以也許不可能替換他的數據,只是等待角度來渲染新圖表 –
@ NoémiSalaün我認爲這是我問的問題。每張圖表都在不同的時間間隔,所以我希望我可以讓每件物品n陣列訂閱更改和更新自己而不必吹散陣列。我嘗試將每個對象作爲數組的訂閱者,但它沒有奏效。我希望有一種方法可以做到這一點,而無需在陣列中搜索ID並自己更新數據。 – Skerrvy