2016-09-29 9 views
6

私はAngularで新しく、true/falseを返す関数を実装する必要があります。canActivateガードでリターンを使用しますが、この関数はhttp.getによってapiを消費し、通信が非同期であるように、この関数は常にhttp.getが処理中であるため、FALSEを返します。Angular2 - canActivateに登録してブール値を返します

私のクラスのガード:

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; 
} 

と関数isLoggedIn()

isLoggedIn() { 

    let logged: boolean = false; 

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

    return logged; 

} 

私は多くの質問を読んで、私は答えを見つけていません。

答えて

7

ガードタイピングそれは

Observable<boolean>, Promise<boolean> or boolean 

を返すことができると言いそうにisLoggedIn変更:

isLoggedIn() { 

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

更新

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

おかげキットが、この方法は私のAPIを呼び出すことはありませ。私が変更した場合:res.json()が呼び出されていますが、このapiが呼び出されている場合、this.http.get( 'api/values'、this.httpService.headers())subscribe(res => res.json())を返します。関数の値として返されました。関数の値としてサブスクライブの結果を返す方法 – Rit

+0

私は自分の答えを編集しました。 map()では値を返しませんでした。今それは動作するはずです。 Subscribation not Observableを返すので、subscribe()を呼び出さないでください。 – kit

+2

AFAIK最後に '.first()'や '.take(1)'を追加する必要がありますので、最初のイベントの後にオブザーバブルが閉じます。それ以外の場合、ルータは永遠に待機します。 –

関連する問題