2017-04-18 54 views
1

首先,我不确定这是处理这个问题的最好方法,但是我要找的是一个用于检查用户是否是“/登录,如果是这样,将它们重定向到“/仪表板”。我想在加载路由之前执行此操作,以避免屏幕闪烁,因为它正在检查远程服务器上的身份验证状态。Angular 2可以通过远程服务来承诺

我正在实现canActivate接口,但它不按预期工作。它碰到auth服务,并返回用户,根据这个测试代码应该重定向用户,但是我在控制台中看到用户,但没有重定向。

下面是代码

import { Injectable }    from '@angular/core'; 
import { Router, CanActivate }  from '@angular/router'; 

import { Observable }    from 'rxjs/Observable'; 

import { User }      from './../../models/user.model'; 
import { AuthService }    from './auth.service'; 

@Injectable() 
export class HomeAuthGuard implements CanActivate { 
    constructor(
    private router: Router, 
    private authService: AuthService 
) {} 

    canActivate(): Promise<boolean> { 
    return new Promise((resolve) => { 
     this.authService.getStatus() 
     .then(function (user: User) { 
      console.log('home auth', user) 
      this.router.navigate(['/dashboard']); 
      resolve(false); 
     }) 
     .catch(function() { 
      resolve(true); 
     }); 
     }); 
    } 
} 
+0

你可以添加一些更多的代码相关的路线,以了解你的问题 –

回答

5

这恰巧监守的 '本' 结合。由于'this'不是您的组件类实例,所以很可能您的代码在console.log之后进入catch块。使用“胖箭头”来解决这个问题。像:

return new Promise((resolve) => { 
    this.authService.getStatus() 
    .then((user: User) => { 
     console.log('home auth', user) 
     this.router.navigate(['/dashboard']); 
     resolve(false); 
    }) 
    .catch(err => { 
     resolve(true); 
    }); 
    }) 
+0

是的,这是做到了。谢谢 ! –