2017-01-21 13 views
0

ObservableからCanActivateに値を戻す方法がわからない
ナビゲーションを続行するには、Angular2 CanActivate Observableから値を取得できない

私はCanActivate実装を使用して、自分のサーバーにhttpリクエストを送信します。 (あれば)
これは、特定の条件に応じて、件名にそれをピックアップしてナビゲーションを継続する
をCanActivateに戻すことができ

を結果を配置します。

しかし、事は走る、
私はそのサブスクリプションから来
ブール値を取得する方法を見つけ出すように見えることはできません。

private isAdminSubj: Subject<boolean> = new Subject<boolean>(); 
private isAdmin: Observable<boolean> = this.isAdminSubj.asObservable(); 
private go:boolean = false; 

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

     /* to store and redirect after login if user not logged in */ 
    let target_url: string = state.url; 

    this.verifyLoginForAdmin(target_url); 

    this.isAdminSubj.subscribe(user_authorized => { this.go = user_authorized;}); 

    return this.go; 

} 

verifyLoginForAdmin(target_url: string){ 

    if(this.authService.isLoggedin()){ 

     let token_email = 
      this.authService 
       .jwt_helper 
       .decodeToken(localStorage.getItem(this.authService.jwt_name)).email; 

     this.authService.isAdmin(token_email) 
      .subscribe({ 
       next: data => { 
       if(data) 
        this.isAdminSubj.next(true) 
        else{ 
         this.router.navigate([ '/coding-blog' ]); 
         this.isAdminSubj.next(false); 
        } 
       }, 
       error: error => console.log("CanActivate Error-->", error), 
       complete:() => console.log("complete") 
      }) 

     }else 

    this.authService.targetUrl = target_url; 

    this.router.navigate([ '/projects' ]); 

    this.isAdminSubj.next(false); 


} 

} 

のAuthService#isAdminは()である:

isAdmin(email: string): Observable<boolean>{ 

    return this.getDbInfo 
     .getOneUserByEmail(email) 
     .map(res => res.json().data.admin); 

} 

私もCanActivate():Observable<boolean>を試してみましたが、どこ購読し、値を取得する方法:

private isAdminSubj: Subject<boolean> = new Subject<boolean>(); 
private isAdmin: Observable<boolean> = this.isAdminSubj.asObservable(); 

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>{ 

     /* to store and redirect after login if user not logged in */ 
    let target_url: string = state.url; 

    this.verifyLoginForAdmin(target_url); 

    return this.isAdmin; 

} 

答えて

0

CanActivateガード内で私が上記のポストで試していたような論理を持つことはできません。

有効な形式は次のとおりです。

ロジックが既に実装された後 this.vefityLoginForAdmin(target_url);
が観測を返さなければなりません
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>{ 

    let target_url: string = state.url; 

    return this.verifyLoginForAdmin(target_url); 

} 

Thanx!

1

あなたがする必要はありません直ちにbooleancanActivateから返すと、Observableまたはを返すこともできます。

https://angular.io/docs/ts/latest/api/router/index/CanActivate-interface.html

interface CanActivate { 
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) : Observable<boolean>|Promise<boolean>|boolean 
} 

だから、あなたはすぐに答えを知っているし、場合Observable<boolean>場合は、答えを決定するために、あなたのサービス/ Httpを呼び出す必要がbooleanを返します。

+0

チェックアウトのためのThanx。 私はそれを理解しているのであなたの提案を編集しましたが、それは私にとってはうまくいかなかったのです。 – wowiamhere

+0

私は値を得るためにobservableを購読する場所を知りません。 – wowiamhere

関連する問題