2017-04-19 85 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

相关问题