2017-02-13 13 views
5

क्या ऑथगार्ड में रिश्तेदार पथ पैटर्न के साथ रीडायरेक्ट करने का कोई तरीका है?कोणीय 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

ठीक है यह इंगित करता है ""। तो यह समझ में आता है कि मुझे '/ सर्वर' पर रीडायरेक्ट क्यों किया जा रहा है। जब मैं इसे ActivatedRoute स्नैपशॉट के साथ आज़माता हूं तो मुझे 'प्रकार का तर्क' मिल रहा है {रिश्तेदार: ActivatedRoute स्नैपशॉट; } 'प्रकार' पैरामीटर के लिए असाइन करने योग्य नहीं है 'NavigationExtras' – crashbus

+1

क्षमा करें, पता नहीं। आप पूर्ण पथ का उपयोग क्यों नहीं कर रहे हैं? –

उत्तर

0

मैं एक छोटे से सहायक समारोह के साथ इस के आसपास काम किया। लेकिन यह केवल तभी काम करता है जब आप यूआरएल की स्कीमा जानते हों।

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


}