2017-04-19 74 views
2

我有一個使用canActivate guard保護的組件。 checkLogin函數中的Authguard從一個observable訂閱,但我不知道如何從它返回一個布爾值到canActivate。返回布爾值而不是訂閱canActivate

guard.service.ts

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

    return this.checkLogin(url); 
    } 

    public checkService:boolean; 
    checkLogin(url: string):boolean { 

     return this.loadAppSettings().subscribe(res=>{ 
       console.log(this.checkservice); 
       if (this.checkservice == true) 
       { 
        return true; 
      } 
      else{ 
       this.router.navigate(['/error-user']); 
       return false; 
      } 
      }); 
     }//checkLogin throws error as type subscription is not assignable to type boolean 

所以,我要的是如果this.checkService是真的,那應該只是返回true,並且用戶應該能夠降落守衛路線上,但如果是假的他應該導航到error-user

Angular2 - return boolean with subscribe to canActivate這個問題與我的類似,但無法解決我的問題。

有人可以幫助這裏。

+0

@Igor是重複仍然相關如果異步調用返回一個observable而不是promise? –

+0

@DavidL - 我會這麼認爲。一個可觀察的事物只不過是一個更多的呼籲。也可以通過使用'.toPromise()'將observable轉換爲promise。 OP還表明他們可以訂閱observable,現在只需要他們瞭解如何使用回調的整個概念。 – Igor

+0

@我的觀點是,它可能是相關的,但它不是完全相同的。有微妙之處,使它成爲一個可憐的重複選擇。 OP的鏈接問題實際上是一個更好的重複。 –

回答

5

canActivate也可以返回一個觀察值,參見定義CanActivate-interface。只需相應地更改您的退貨類型。

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

    return this.checkLogin(url); 
} 

public checkService:boolean; 
checkLogin(url: string):Observable<boolean> { 
    return this.loadAppSettings().map(res=>{ 
      console.log(this.checkservice); 
      if (this.checkservice == true) 
      { 
       return true; 
     } 
     else{ 
      this.router.navigate(['/error-user']); 
      return false; 
     } 
    }); 
    } 
+0

它說'類型訂閱不可分配到類型Observable ' –

+0

@AakashThakur - 對不起,應該是'地圖'不''訂閱',更新的代碼。 – Igor

+1

非常感謝伊戈爾。 –