2017-07-18 66 views
1

任何人都可以幫助我解決爲什麼Angular guard中的異步調用在調用返回結果後不會激活路由嗎?我嘗試了一些利用承諾和有限運氣觀察的方法。我也發現這個github issue特別是阿爾巴科夫的建議。對我來說,重要的是要注意執行下面的代碼片段。我在控制檯中看到控制檯消息,所有正確的值我也能夠在服務器端api調用中斷開。結果被傳遞到canActivate守護返回的可觀察值中,但路由未按預期激活。來自角度路由衛士的Web Api呼叫

服務方法與屬性,調用API,並結合與結果_isAuthorized主題:

private _isAuthorized: ReplaySubject<boolean> = new ReplaySubject(1); 
get isAuthorized() { return this._isAuthorized.asObservable(); } 

checkAuthority(id: number) { 
    return this._http.get(this._apiUrl).toPromise().then((response) => { 
     console.log(response + ' I resolved!'); 
     if (response.status === 200) 
      this._isAuthorized.next(true); 
    }); 

消費後衛可以激活方法:出現在頁面任何形式的

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): any { 
    let id: number = this.getId(); 

    if (!this._oauthService.hasValidIdToken()) { 
    this._router.navigate([`/login/${id}`]); 
    return Observable.of(false); 
    } 

    this._myService.checkAuthority(id); 
    return this._myService.isAuthorized.first(); 
} 

沒有控制檯錯誤只是在可見布爾值的解析爲真之後纔會路由。

UPDATE 如果我改變重定向從登錄組件的保護(防護)路線硬重定向上面的代碼工作(即:window.location.href),而不是router.navigate電話。如果沒有登錄組件的硬重定向,則路由器將在取消跟蹤後取消導航,並解析api調用後的受保護路由。

回答

2

Angular 2 - Routing - CanActivate work with Observable

只返回觀察到的(Observable<boolean>)中後衛,也將努力!

+0

你是對的,它應該以這種方式工作,但由於某種原因,OIDC的附加組件重新轉回到將您重新發送到您被阻止的頁面(同時未經授權)的路徑導致導航被取消由路由器。如上所述,如果您發出硬刷新,則它可以正常工作,因爲它在授權後不會經過着陸URL。 – Shawn

+0

你是對的,我使用的OAuth/OIDC庫似乎存在問題。 – Shawn