Ich versuche, ein Dashboard für Diagramme mit angular 2 und chart.js (über ngcharts) zu erstellen. Ich hätte gerne eine Reihe von Diagrammen, die jeweils über eine HTTP-Anfrage in einem benutzerdefinierten Intervall aktualisiert werden.Wie aktualisiert man ein Array von Observablen mit Intervall?
Im Moment habe ich drei separate Diagrammaufrufe, die Daten an ein Array senden. Ich habe Probleme, wenn es um die nächste Iteration geht - wenn ich erneut zum Array gehe, werde ich mit 3 weiteren Charts enden. Ich möchte, dass die Abonnenten im Array mit neuen Daten aktualisiert werden, wenn das Intervall sie ausgibt.
Ich bin ein wenig verwirrt, wie die Komponente/Service/http-Beziehung für meinen Anwendungsfall richtig zu strukturieren. Ich fühle, dass ich nah bin, aber ich vermisse definitiv etwas. Wie kann ich die Intervall-/Abonnentenbeziehung auf die Ansicht mappen und die vorhandenen Diagramme in einem Intervall aktualisieren? Jede Hilfe wäre großartig!
Gerade jetzt:
Service:
Ich bin der Umsetzung des Intervalls hier:
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 ist nur die Antwort zu nehmen und zu manipulieren sie mit dem Diagramm JS zu arbeiten. Sie gibt ein Graph-Objekt mit Eigenschaften zurück, mit denen Sie einfach arbeiten können. Ich habe keine Kontrolle über die API, daher kann ich die Antwort nicht so konfigurieren, dass sie mehr als einen Graphen enthält.
Die Komponente:
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)
);
}
}
Aussicht:
<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>
statt drängen neue Graph in Ihrem Array, können Sie nicht einfach die vorhandenen Graphen durch neue Daten ersetzen? Ich weiß nichts über chart.js, also ist es vielleicht nicht möglich, seine Daten zu ersetzen und warten Sie einfach auf Winkel, um das neue Diagramm zu rendern –
@ NoémiSalaün Ich denke, das ist eine Art von dem, was ich frage.Jede Tabelle hat ein anderes Intervall, also hoffe ich, dass ich jedes Item haben kann n Das Array abonniert Änderungen und aktualisiert sich selbst, ohne das Array wegblasen zu müssen. Ich habe versucht, jedes Objekt als Abonnent auf das Array zu schieben, aber es hat nicht funktioniert. Ich hoffe, dass es einen Weg gibt, dies zu tun, ohne das Array nach der ID durchsuchen zu müssen und die Daten selbst zu aktualisieren. – Skerrvy