2016-06-01 14 views
6

Używam API Github do ładowania danych użytkownika i jego obserwatorów w mojej aplikacji kątowej 2, ale wyświetlanie renderuje, zanim ngOnInit zakończy ładowanie danych iz tego powodu otrzymam: Cannot read property of undefined błąd. Mój kod fragment wygląda tak:kątowe wyświetlanie 2 rzutów przed ładowaniem danych w 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; 
    }); 
} 

jeśli piszę kod HTML tak:

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

działa prawidłowo, ale zwraca błąd Cannot read property 'avatar_url' of undefined gdy kod zapisu html bez *ngIf tak:

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

pamiętać również: getFollowers działa dobrze, ale jeśli przeniosę getFollowers przed w forkJoin metody następnie działa dobrze i getFollowers trzeba *ngIf aby uniknąć błędu. Czy można pisać bez dodatkowego kodu * ngIf? żadnych pomocników, Wielkie dzięki.

+0

Zaakceptowanych odpowiedź tylko mówi o unikanie błędów. Jeśli chcesz rozwiązać główną przyczynę, możesz użyć 'resolvera', aby uzyskać dane API przed zainicjowaniem komponentu. Sprawdź artykuł [this] (https://shermandigital.com/blog/wait-for-data-before-rendering-views-in-angular-2/). – Voicu

Odpowiedz

11

Można użyć operatora bezpiecznej nawigacji (Elvis), aby uniknąć błędu jak

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

lub

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

dziękuję za odpowiedź, upvoted, ale jestem zainteresowany jest ok, gdy widok sprawia przed ładunku danych w ngOnInit? – kaxi1993

+4

To normalne zachowanie. Połączenie z serwerem może trwać "w wieku". Angular właśnie renderuje widok, gdy komponent jest tworzony i aktualizuje go po nadejściu danych (po zaktualizowaniu modelu). Występują żądania dotyczące funkcji wywołania zwrotnego cyklu życia, które czekają na wyrenderowanie szablonu do momentu rozwiązania obietnicy, ale obecnie nie jest ona obsługiwana. –

+1

Ok dziękuję, życzę pomyślności;) – kaxi1993

Powiązane problemy