2017-02-13 6 views
5

Есть ли способ перенаправления с относительным шаблоном пути в authguard?Углеродный 2 аутсертификационный относительный переадресации

Я пробовал с

@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; 
     // } 


} 
Смежные вопросы