2017-02-13 17 views
5

Kimlik denetiminde göreli bir yol deseni ile yeniden yönlendirmenin bir yolu var mı?Açısal 2 gerçek yön bağıntılı yönlendirmeler

Ben /projects/2/servers/ için /projects/2/servers/71 yönlendirmesi ama (Bence iyi çalışan bir bileşende aynı yaptığınızda) Hep /servers yönlendirebilirsiniz hangi

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

ile çalıştı. Biraz yardımcı fonksiyonu ile bu çalıştı

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


} 
+0

'this._route' işaret ne yoldur? –

+0

Tamam, "" işaretini işaret edin. Bu yüzden neden '/ server'lere yönlendirildiğimi anlamlandırıyor. ActivatedRouteSnapshot ile denediğimde, "türden bağımsız değişken" alıyorum {relativeTo: ActivatedRouteSnapshot; } '' NavigationExtras '' parametresine atanamaz ' – crashbus

+1

Üzgünüm, bilmiyorum. Neden mutlak yolu kullanmıyorsun? –

cevap

0

relativeTo ayrıca ActivatedRouteSnapshot, bu gözden kaçmış olabilecek gibi burada bu arada, görünen bir geçici çözüm olduğunu kabul etmelidir. Ancak bu sadece URL'nin şemasını biliyorsanız çalışır.

/** 
* 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); 
} 

Kullanımı:

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