2017-06-16 119 views
0

我有一個保護,檢查用戶的會話。 我從承諾創建observable並返回可觀察值。保護總是重定向到默認路由

不幸的是,路由器總是將刷新時重定向到主頁。 我想它與observable有關,因爲當我簡單地導航時,它會進入if並返回'Observalbe.of(true)',這是有效的。

@Injectable() 
export default class SessionGuard implements CanActivate { 

    constructor(private authService: AuthService) {} 

    public canActivate(): Observable<boolean> | Promise<boolean> | boolean { 
    if (this.authService.hasSessionChecked) { 
     return Observable.of(true).take(1); 
    } 

    const obs = Observable.fromPromise(this.authService.getSession()); 
    return obs.map((session) => { 
     this.authService.setUserSession(session); 
     return true; 
    }).take(1); 
    } 
} 

我試着用'返回true'替換observable,並且所有工作都按預期工作。

任何想法?謝謝!

回答

0

它不工作,因爲canActivate應該返回一個布爾值。

爲什麼要使用Observable?

+0

是心不是真實的,在界面中canActivate的定義允許3種返回類型:導出接口CanActivate { canActivate(路線:ActivatedRouteSnapshot,狀態:RouterStateSnapshot):可觀察 | Promise |布爾; } –

+0

https://angular.io/api/router/CanActivate第一個示例的第15行。 – Bogdan

+0

只要在它下面的行,你可以看到它從許可中返回canActivate函數。看看這個函數返回什麼。 – trichetriche

0

首先canActivate的定義如下:

export interface CanActivate { 
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean; 
} 

所以,你應該在函數中添加的參數。

第二個,如果您要返回一個observable並且只有一個observable,那麼將返回類型更改爲observable。如果你想要混合,那麼你可以留下多個返回類型。

,取出取()運算符和重構後衛,看起來像這樣:

@Injectable() 
export default class SessionGuard implements CanActivate { 

    constructor(private authService: AuthService) {} 

    public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { 
    if (this.authService.hasSessionChecked) { 
     return true; 
    } 
    const obs = Observable.fromPromise(this.authService.getSession()); 
    return obs.map(session => { 
     this.authService.setUserSession(session); 
     return true; 
    }); 
    } 
} 
+0

我得到了同樣的結果 – Bogdan

0

由於@trichetriche的建議,我已經取代了觀察到的一個承諾,並返回。

現在工作很好。

return this.authService.getSession().then(
    data => { 
    this.authService.setUserSession(data); 
    return true; 
    }, 
    err => false, 
);