2017-02-16 64 views
0

我有一個問題,我的canActivate方法返回false並且仍然導航到屏蔽屏幕。這個問題只在Chrome中出現,而在IE中一切正常。 canActivate方法看起來艾克這樣的:canActivate返回false並且仍然進入屏幕Angular 2

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return this.getDataFromApi(state.url) 
     .toPromise() 
     .then(result=> { 
      return result; 
     }); 
} 

而且getDataFromApi():

getDataFromApi(link): Observable<boolean> { 
    return this.http.get("api/security") 
        .map(response => { 
         var url = link.replace("/", ""); 
         var data = response.json(); 
         var privileges = data["privileges"]; 
         var currentItem = privileges[url]; 
         return currentItem["view"]; 
        }); 
} 

有什麼辦法來解決在Chrome這個問題?感謝提前。

編輯 我已經在IE,EDGE,Firefox中檢查了問題不存在的地方。 Chrome只能與開發者控制檯打開。

+1

你在'currentItem [「view」]中返回布爾值嗎? – VadimB

+0

@VadimB是啊,我應該提到currentItem [「view」]返回布爾值。 –

回答

0

這看起來像一個異步問題給我。

在你看守你要退回return this.getDataFromApi(state.url),那麼當這個結算時,你再次嘗試返回return result;。這意味着你的警衛實際上正在返回之前,你返回result

我建議設置一個服務來處理登錄並保持身份驗證狀態。該服務可以有屬性,如isLoggedIn: boolroles: Role[]

然後,在你守衛,你簡單的檢查與服務,如果用戶isLoggedIn(或類似的東西)。如果用戶通過身份驗證,則返回true,否則將您重定向到登錄頁面。如果用戶已登錄,請檢查用戶是否獲得了正確的角色(使用服務中的預加載角色),然後相應地返回truefalse

看看official docs,他們有一個很好的這種方法的例子。

相關問題