2017-01-16 2 views
0

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?

+0

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

+0

@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 –

+0

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

Antwort

1

Von Ihren Kommentaren denke ich, dass es nichts mit Zonen zu tun hat. Sie müssen Ihre sekundäre Komponente aktualisieren, wenn sich Ihre @ Input-Eigenschaften ändern.

export class SecondaryComponent { 

    private _myProperty: any; 
    @Input() 
    set myProperty(val: any) { 
     this._myProperty = val; 
     this.update(); 
    } 

    update() { //instead of ngOnInit just use this 
     //do stuff with _myProperty now 
    } 

} 

Warum können Sie nicht einfach an das Feld auth.userProfile innerhalb dieser sekundären Komponente binden? Sofern Sie die Daten nicht irgendwie in die sekundäre ngOnInit-Methode transformieren, wäre das wahrscheinlich einfacher.

Verwandte Themen