2016-06-01 7 views
6

Ich benutze Github API, um Benutzer und seine Anhänger Daten in meiner angular 2 App zu laden, aber anzeigen rendert bevor ngOnInit beendet Daten laden und deshalb erhalte ich: Cannot read property of undefined Fehler. Mein Codefragment sieht wie folgt aus:angular 2 view rendert vor dem Laden von Daten in ngOnInit

ngOnInit() { 
    Observable.forkJoin(
     this._githubService.getUser('kaxi1993'), 
     this._githubService.getFollowers('kaxi1993') 
    ) 
    .subscribe(res => { 
     this.user = res[0]; 
     this.followers = res[1]; 
    }, 
    null, 
    () => { 
     this.isLoading = false; 
    }); 
} 

wenn ich HTML-Code wie folgt schreiben:

<div *ngIf="user && user.avatar_url"> 
    <img class="media-object avatar" [src]="user.avatar_url" alt="..."> 
</div> 

funktioniert gut, aber gibt Fehler Cannot read property 'avatar_url' of undefined wenn Schreib HTML-Code ohne *ngIf wie folgt aus:

<img class="media-object avatar" [src]="user.avatar_url" alt="..."> 

auch Hinweis: getFollowers funktioniert gut, aber wenn ich mich bewege getFollowers vor in forkJoin Methode dann funktioniert gut und getFollowers brauchen *ngIf um Fehler zu vermeiden. Ist es möglich ohne extra * ngIf Code zu schreiben? irgendwelche Hilfe Jungs, Vielen Dank.

+0

Die akzeptierte Antwort nur Gespräche über die Vermeidung der Fehler zu vermeiden. Wenn Sie die Grundursache lösen wollen, können Sie einen 'resolver' verwenden, um die API-Daten zu erhalten, bevor Ihre Komponente initialisiert wird. Schauen Sie sich diesen Artikel an (https://shermandigital.com/blog/wait-for-data-before-rendering-views-in-angular-2/). – Voicu

Antwort

11

Sie können die sicheren Navigation (Elvis) Operator verwenden, um den Fehler wie

<div *ngIf="user?.avatar_url"> 
    <img class="media-object avatar" [src]="user.avatar_url" alt="..."> 
</div> 

oder

<img class="media-object avatar" [src]="user?.avatar_url" alt="..."> 
+2

Vielen Dank für Ihre Antwort, upvoted, aber ich bin interessiert, ist es in Ordnung, wenn die Ansicht rendert, bevor Daten in ngOnInit lädt? – kaxi1993

+4

Das ist normales Verhalten. Der Anruf zum Server kann "Zeitalter" dauern. Angular rendert nur die Ansicht, wenn die Komponente erstellt wird, und aktualisiert sie, wenn Daten eintreffen (wenn das Modell aktualisiert wird). Es gibt Featureanforderungen für einen Lebenszyklus-Callback, der darauf wartet, dass die Vorlage gerendert wird, bis ein Versprechen aufgelöst wird. Dies wird derzeit jedoch nicht unterstützt. –

+1

Ok danke, wünsche dir viel Glück;) – kaxi1993