2017-04-19 39 views
0

我正在構建一個angular2 SPA。我正在使用內置的路由器組件,並且我已經實現了一個routeGuard。像這種警衛通常那樣,我檢查用戶是否登錄,如果他不是,那麼我希望將他發送到登錄屏幕。通常情況下,我使用的是#方案,因爲這個應用程序必須與其他代碼在同一個Web服務器上很好地發揮作用。router.navigate爲什麼在空白頁面上留下我沒有錯誤信息?

預期行爲:出現登錄屏幕。

實際行爲:路由「無處」。我坐着看着一個空白的屏幕。

路線後衛:

import { Injectable } from '@angular/core'; 
import { AuthenticationService } from './authentication.service'; 

import { 
    CanActivate, Router, 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot 
    } from '@angular/router'; 
import { GlobalsService } from "./globals.service"; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private _service: AuthenticationService, private router: Router, private _globals: GlobalsService) { 
     console.log("Auth Guard Ready!"); 
    } 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> { 
     let url: string = state.url; 
     return new Promise<boolean>((resolve, reject) => { 
      if (this._service.checkLoggedIn()) { 
       console.log("User is logged in, possible to check for globals"); 
       if (this._globals.globalsReady) { 
        console.log("Globals are already loaded, user may proceed to the page"); 
        resolve(true); 
        return; 
       } 
       console.log("Globals are not ready yet, asking server for the data.."); 
       this._globals.getGlobals() 
        .done(() => { 
         console.log("Globals are now loaded, user may proceed to the page"); 
         resolve(true); 
        }) 
        .error((error: any) => { 
         console.log("Error fetching globals. Navigation terminated"); 
         console.log("Error: " + error); 
         resolve(false); 
         return; 
        }); 
      } else { 
       // we couldnt find any way to auth, so sending user to login screen 
       console.log("User is not logged in - sending user to login page, no need for globals there"); 
       this.router.navigate(["/login"]); 
      } 
     }); 
    } 
} 
+0

你能不保護正常到達您的登錄路由?你確定問題來自它嗎? –

+1

你也應該'resolve(false);'當用戶重定向後沒有登錄。 –

+0

是的,我可以正常登錄路線,我99%肯定它是來自後衛 – user230910

回答

1

的後衛需要知道要爲所有的情況下做的。

添加resolve(false);時未登錄用戶(後重定向)會做的伎倆

+1

我還在踢我自己,它是如此愚蠢的事情..但我沒有辦法看到它沒有幫助。這感覺有點像我在這裏開拓,在線資源遍佈地圖(關於版本),這個組件(路由)似乎已經經歷了其短暫的歷史中的一些驚人的變化.. – user230910

+1

拿走這裏是那導航不會「完成」後衛。你必須始終提供一個返回值。 – user230910

相關問題