2016-04-13 5 views
8

Angenommen, ich habe eine Route mit einem solchen Parameter (in Angular 2): /user1/products/:id, der untergeordnete Routen wie /user1/products/3/reviews haben könnte.angular 2 Route zu 404 Seite wenn Route Param ungültig ist

Wenn ich zu /user1/products/-1 navigiere, überprüfe ich mit meinem Server und wenn das Produkt nicht existiert, möchte ich eine 404 Seite rendern, ohne den Browserverlauf zu beeinflussen.

Mit router.navigate(['/404']) oder router.navigateByUrl('/404') scheint nicht zu funktionieren, weil es sowohl fügt /user1/products/-1 und /404 in den Browser-History.

Bedeutung, wenn ich die Zurück Taste im Browser drücken, gehe ich zu /user1/products/-1 zurück, die sofort zu /404 umgeleitet wird, und ich bin im Wesentlichen auf /404 stecken.

In ExpressJS würden wir etwas wie next() tun, um die Anfrage an unseren 404-Handler zu übergeben. Gibt es in Angular 2 ein clientseitiges Äquivalent?

+0

Siehe auch http://stackoverflow.com/questions/34227194/ handling-404-with-angular2 –

Antwort

6

aktualisieren

Im neuen Router V3 können Sie Wachen verwenden, wie in https://angular.io/guide/router#canactivate-requiring-authentication erklärt

Original-

ich glaube, Sie @CanActivate() verwenden sollten, um die Prüfung zu tun. Wenn Sie nach vorn in @CanActivate() die ungültigen URL nicht zu der Geschichte hinzugefügt werden soll (nicht versucht)

Siehe auch https://github.com/angular/angular/issues/4112, wie DI verwendet in @CanActivate()

+0

Danke für den Link, ich habe den Router in '@CanActivate()' injiziert, aber es sieht so aus als ob 'router.navigate' in den Verlauf schiebt, wenn Sie direkt über die Adresse des Browsers zu einer ungültigen Seite navigieren bar, verursacht die ** Back ** bu Tton Funktionalität zu brechen. – Simonxca

+0

Ich verstehe.Eine andere Idee wäre es, eine benutzerdefinierte ' zu verwenden, die ich selbst nicht ausprobiert habe. Ich denke, ich habe kürzlich einen Beispielcode gepostet (nicht meins) hete auf SO –

+1

Ich fragte die eckigen Jungs. Wir können 'router.navigateByUrl (url, true)' 'im' @CanActivate() 'Hook verwenden, um dieses Problem zu lösen. – Simonxca

0

Es ist wirklich interessante Frage, vielleicht sollten Sie es als Feature melden anfordern. Ich wäre nett, Zugriff auf Router-Anweisung innerhalb loader Rückruf von RouteDefinition haben.

Sie könnten versuchen, die Validierung zu emulieren, indem Sie die Standardroute /** hinzufügen und den Parameter regex von RouteDefinition verwenden, um nur positive Zahlen zu finden.

3

Ok, das ist bereits implementiert, nur nicht gut dokumentiert.

Nach der Dokumentation:
router.navigateByUrl(url: string, _skipLocationChange?: boolean) : Promise<any>

hat einen Parameter _skipLocationChange, die die Geschichte nicht ändern wird.
Diese werden den Trick:

router.navigateByUrl('/404', true); router.navigateByInstruction(router.generate(['/404']), true);

3

Ab Angular 2 endgültig das ist die Lösung:

this._router.navigateByUrl('/404', { skipLocationChange: true }) 
Verwandte Themen