2017-02-13 84 views
5

有沒有辦法在authguard中使用相對路徑模式進行重定向?Angular 2 authguard相對重定向

@Injectable() 
export class ServerAuthGuard implements CanActivate { 
    constructor(private _router: Router, 
       private _route: ActivatedRoute) { 
    } 

    canActivate(route: ActivatedRouteSnapshot): boolean { 
     this._router.navigate(['../../servers/'], {relativeTo: this._route}); 

     return false; 
    } 
} 

嘗試它應該從/projects/2/servers/71重定向到/projects/2/servers/但它總是重定向到/servers(當我做相同的,它工作正常的組件)。

+0

什麼途徑是'this._route'指向? –

+0

確定它指向「」。所以我明白爲什麼我要重定向到'/ servers'。當我用ActivatedRouteSnapshot嘗試它時,我得到一個'{relativeTo:ActivatedRouteSnapshot; }'不能分配給類型爲'NavigationExtras''的參數 – crashbus

+1

對不起,不知道。你爲什麼不使用絕對路徑? –

回答

0

我工作圍繞這一個小助手功能。但是這隻有在你知道url的模式時纔有效。

/** 
* ATTENTION: RECURSIVE 
* 
* We are searching for the url "searchString" which comes before 
* the parameter we are really search. 
* E.g. if you have a url like "projects/:projectId/servers/:serverId 
* and you need the :projectId your 'searchString' is 'servers' 
*/ 
function getUrlParameterByChild(searchString: string, 
           route: ActivatedRouteSnapshot, 
           next: boolean = false): string { 
    let url: string = route.url[0] ? route.url[0].path : ''; 

    if (!url && !route.parent) { 
     throw new Error('Parameter not found in url'); 
    } 

    if (next) { 
     return url; 
    } 

    return getUrlParameterByChild(searchString, route.parent, url === searchString); 
} 

使用

this._router.navigate([ 
    'projects', 
    getUrlParameterByChild('servers', route), 
    'servers' 
]) 
0

對於relativeTo也應該接受ActivatedRouteSnapshot,看起來這可能被忽視,在此期間,這裏是一個解決辦法:

canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 
     // if(...) { 
     const segments = state.url.split('/'); 
     segments.pop(); 
     segments.shift(); 
     this.router.navigate(segments); 
     // } else { 
     // return true; 
     // } 


}