Ich habe einen einfachen Dienst tut ein paar Anfragen bekommen:Angular2 Aktualisierungswert von HTTP-Anfrage
getDevices() {
return this.http.get('https://api.particle.io/v1/devices')
.map((response: Response) => response.json());
}
getVariable(deviceId: string) {
return this.http.get('https://api.particle.io/v1/devices/' + deviceId + '/running')
.map((response: Response) => response.json());
}
In meiner Komponente habe ich die folgende Funktion, welche Geräte und fügt die Variable aus getVariable an jedes Gerät in dieser abruft. Geräte.
getDevicesAndRunning() {
function callback(array, data, res) {
array.push(Object.assign(data, {"running": res.result}))
}
this.photonService.getDevices()
.subscribe(
data => {
const myArray = [];
for (var i=0; i<data.length; i++) {
if (data[i].connected) {
console.log(data, i);
this.photonService.getVariable(data[i].id)
.subscribe(
callback.bind(this, myArray, data[i])
);
};
}
this.devices = myArray;
}
);
}
dann kann ich getDevicesAndRunning()
rufen Sie die Liste der Geräte zu aktualisieren und über sie in der Ansicht durchlaufen. Momentan mache ich das in OnInit
und wann auch immer der Benutzer eine Taste klickt. Da this.devices
jedoch jedes Mal, wenn die Funktion aufgerufen wird, erneut gefüllt wird, sieht der Benutzer eine leere Liste, unabhängig davon, wie lange die Anforderung dauert, um zu antworten. Alles, was ich will, ist für die res.result
aktualisiert werden, nicht das gesamte Array.
Das klingt wie eine akzeptable Lösung, aber ich habe einige Probleme beim Klonen des alten Arrays in ein neues. Dies muss innerhalb der getDevices-Subscribe-Funktion geschehen, richtig? Sonst wird das alte Array nicht gefüllt, bevor wir versuchen, es zu spleißen? Aus irgendeinem Grund this.de.devices = this.oldDevices.slice(); gibt undefined zurück, auch wenn es nach dem Auffüllen von oldDevices passiert. – amunds
Ich würde nicht versuchen, es zu spleißen, in der Tat verwende ich nur Spleiß und Slice (In-Place-Edits), wenn ich (einige Such/Sortier-Algs und whatnot). Lassen Sie das alte wieder alleine und bauen Sie das neue daraus mit Karte, Filter, etc. –
Denken Sie auch daran, angular.copy ist Ihr Freund. EZ kopiert. Wenn Sie tiefe Kopien benötigen, können Sie es auch tun, ein wenig Suche nach dem Thema wird Ihnen den Weg zeigen. –