我正在尝试为使用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