2017-06-28 4 views
0

In der Beispiel-Routing-Konfiguration unten erhalte ich einen Fehler: Kann nicht auf '/ IP /: ID' umleiten. Kann ': ID' nicht finden, wenn localhost: 8080 \ sso \ ip \ 1 eingegeben wird. Ich versuche zu verstehen, wie man variable Segmente des Pfades umleitet. In diesem Fall: ID scheint nicht gefunden zu werden. Ich referenzierte https://vsavkin.com/angular-router-understanding-redirects-2826177761fc, die einen ähnlichen Anwendungsfall beschreibt, bei dem ein dynamisches Segment innerhalb einer redirectTo-Eigenschaft verwendet wird.Angular - Router Config - redirectTo mit Parameter/Variable Segment

Wird die ID mit dem Parameter: id von der initiierten/sso/ip/: id Route aufgelöst? Eine ähnliche Frage wurde gestellt, aber niemals beantwortet: https://groups.google.com/forum/#!topic/angular/Mw0N3qYphO8.

Jede Hilfe wird sehr geschätzt?

+0

Können Sie den Code anzeigen, den Sie verwenden, um auf diese Route umzuleiten? – DeborahK

+0

@DeborahK Ich denke, es ist alles in Route-Konfigurationen. Wenn der Benutzer zu '/ sso/ip /: id' geht, möchte OP zu'/ip /: id' umleiten, wobei er denselben Wert für ': id' benutzt, der für den ursprünglichen Pfad bereitgestellt wurde. Es sieht jedoch so aus, als ob der Router nach der literalen Route '/ ip /: id' sucht (ohne den ID-Wert zu ersetzen), eine Route, die nicht existiert, da': id' nur ein Parameter – BeetleJuice

+0

ist eine routerLink- oder .navigate() -Methode, die dies tut. Ich hatte gehofft, diesen Code zu sehen, um zu sehen, wie dieser Prozess gemacht wurde. Oder vielleicht missverstanden ... gibt der Benutzer den Pfad in die Adressleiste ein? – DeborahK

Antwort

0

Mein Ansatz wäre, Umleitung manuell zu behandeln, wenn ich die Routen-Konfiguration nicht zum Funktionieren bringen kann. Habe eine RedirectService mit einer redirectInFlight() Methode, die auf die Router.events Observable hört. Wenn der Router auf einen Zielpfad zu gehen versucht, wie /sso/ip/:id, transparent auf dem richtigen Weg umleiten: /ip/:id

Ich würde den Dienst zu AppModule.providers fügen Sie dann, spritzen den Dienst in AppComponent und redirectInFlight()

AppComponent nennen

@Component({ 
    templateUrl: 'app.component.html' 
}) 
export class AppComponent implements OnInit { 

    //inject the RedirectService 
    constructor(private redirectSvc:RedirectService){} 

    //start listening to the router and redirecting 
    ngOnInit() {this.redirectSvc.redirectInFlight();} 
} 

RedirectService

import {Injectable} from '@angular/core'; 
import {Router} from '@angular/router'; 
import 'rxjs/Rx'; //replace with just the classes you need from RxJS library 

@Injectable() 
export class RedirectService { 
    events$:Observable<any>; //stream of Router events 

    constructor(private router:Router) { 
     this.events$ = 
      //listen to router events and inspect the `url` string property 
      //and filter for urls that begin with /sso 
      this.router.events.filter(e=> e.url && e.url.startsWith('/sso')) 
    } 

    redirectInFlight(){ 
     //First remove /sso from the start of url to fix it 
     this.events$.map(e => e.url.replace('/sso','')) 
      //navigate to the fixed URL 
      .subscribe(newUrl=>this.router.navigateByUrl(newUrl)); 
    } 
} 

Schließlich können Sie den gesamten sso Pfad und seine untergeordneten Pfade von Ihrer Router-Konfiguration entfernen und es sehr vereinfachen.

Live demo

Hinweis: Diese Implementierung ist ein Ausgangspunkt. Sie können es robuster machen, indem Sie eine Karte von Umleitungen speichern und darauf verweisen, anstatt "/ sso" zu codieren.

Verwandte Themen