2017-04-18 52 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

是的,這是做到了。謝謝 ! –