2016-09-29 20 views
6

Angular'da yeniyim, true/false döndüren bir işlevi uygulamam gerekiyor, canActivate muhafazasındaki dönüşü kullanacağım, ancak bu işlev http.get tarafından bir api tüketiyor, iletişim eşzamansız olduğu gibi, bu işlev her zaman FALSE döndürür, çünkü http.get henüz işlemdedir.Angular2 - canActivate'e abone ile boolean dönüş

Benim sınıf bekçi:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 

    let url: string = state.url; 


    if (this.loginService.isLoggedIn()) { 
     return true; 
    } 

    this.loginService.redirectUrl = url; 

    this.router.navigate(['login']); 

    return false; 
} 

ve fonksiyon isLoggedIn()

isLoggedIn() { 

    let logged: boolean = false; 

    this.http.get('api/values', this.httpService.headers()) 
     .map((res: Response) => { 
      logged = res.json(); 
     }); 

    return logged; 

} 

ben çok soru okumak, ama cevap buldu yok.

cevap

7

bekçi typings o

Observable<boolean>, Promise<boolean> or boolean 

böylece için isLoggedIn değiştirmek dönebileceğini söyledi:

isLoggedIn() { 

    return this.http.get('api/values', this.httpService.headers()) 
    .take(1) 
    .map((res: Response) => res.json()); 
}  

güncelleme

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    let url: string = state.url; 

    return this.isLoggedIn().map(loggedIn => { 
     if(!loggedIn) { 
     this.loginService.redirectUrl = url; 
     this.router.navigate(['login']); 
     } 
     return loggedIn; 
    } 
} 
+0

sayesinde Takımı, ama bu şekilde benim api demiyorlar. eğer değiştirirseniz: this.http.get ('api/değerleri', this.httpService.headers()) döndürür. subscribe (res => res.json()) benim api'mdir, ancak res.json() isn fonksiyonun değeri olarak geri döndürülür, aboneliğin sonucunu nasıl döndürürüm işlevi olarak – Rit

+0

cevabımı düzenledim. Haritada() ben değer vermedim. Şimdi çalışmalı. Abone olmadığında Gözlemlenemeyen aboneliği() çağırmayın. – kit

+2

AFAIK hala, ilk olaydan sonra gözlemlenebilir kapanacak şekilde '.first()' veya '.take (1)' eklemeniz gerekir. Aksi halde yönlendirici sonsuza kadar bekler. –