Ich frage mich, wie ich eine HTTP-Anfrage ausführen kann, wo ich die Profilansicht innerhalb der Angular2 Zone aktualisieren. In meiner Top-Level-Profil Komponente mache ich zur Zeit eine einzige einfache HTTP-Anfrage authHttp
mit:Execute HTTP-Anfrage innerhalb NgZone mit Angular2
export class ProfileComponent implements OnInit {
constructor(
private auth: Auth,
private authHttp: AuthHttp) {}
ngOnInit() {
// update profile information
let headers: any = {
'Accept': 'application/json',
'Content-Type': 'application/json'
};
this.authHttp
.get('https://' + myConfig.domain + '/api/v2/users/' + this.auth.userProfile.user_id, {headers: headers})
.map(response => response.json())
.subscribe(
response => {
this.auth.userProfile = response;
localStorage.setItem('profile', JSON.stringify(response));
},
error => console.log(error.json().message)
);
}
}
Das Problem ist, dass, da diese Anforderung asynchron ist, ist die Profilseite lädt vor diese Anforderung erfüllt und das Profil ist aktualisiert. Was passiert, wenn ich zum ersten Mal auf Aktualisieren klicke, passiert nichts, weil die alten Daten in das Profil geladen werden und die neuen Daten AFTER. Das zweite Mal, wenn ich auf "Aktualisieren" klicke, funktioniert alles, denn erst dann werden die neuen Daten verwendet, die von der letzten Anfrage geladen wurden.
Ist dieses Problem mit NgZone
lösbar? Kann ich diese Anfrage irgendwie in die Zone aufnehmen, wenn sie fertig ist, bewertet sie den Komponentenbaum neu?
Ich bin immer noch ein bisschen verwirrt. Was wird nicht aktualisiert? Deine Ansicht? Sind Sie mit dem auth.userProfile in Ihrer Ansicht verbunden? Und es wird nicht aktualisiert, wenn die Anfrage über authHttp zurückkommt? – Steveadoo
@Steveadoo Ich übergebe einige Daten von 'auth.userProfile' als Eingabe in eine andere Komponente in der Vorlage der Profilkomponente, so dass die alten Daten als Eingabe übergeben werden, bevor 'auth.userProfile' aktualisiert werden kann die http-Anfrage –
Woher weißt du, dass es ein Zonenproblem ist? Wenn man sich AuthHttp anschaut, sieht es nicht so aus, als würde es außerhalb der eckigen Zone laufen. Wenn Sie die Eigenschaft auth.userProfile als @Input() an Ihre andere Komponente übergeben, sollte sie automatisch aktualisiert werden, wenn Sie sie ändern. Haben Sie zufällig die @Input-Eigenschaften innerhalb des ngOnInit in dieser anderen Komponente gelesen? – Steveadoo