2016-04-13 15 views
8

Dire che ho un percorso con un parametro come questo (in Angular 2): /user1/products/:id, che potrebbe avere percorsi figlio come /user1/products/3/reviews.2 di rotta angolare a 404 pagine quando il parametro di instradamento non è valido

Quando mi trovo su /user1/products/-1, controllo con il mio server e se il prodotto non esiste, desidero eseguire il rendering di una pagina 404 senza influire sulla cronologia del browser.

Utilizzando router.navigate(['/404']) o router.navigateByUrl('/404') non sembra funzionare perché aggiunge sia /user1/products/-1 e /404 alla cronologia del browser.

Significato quando si preme il pulsante di Indietro nel browser, torno a /user1/products/-1 che viene immediatamente reindirizzato a /404 e sto sostanzialmente bloccato a /404.

In ExpressJS, faremo qualcosa come next() per passare la richiesta al nostro 404 gestore. Esiste un equivalente lato client in Angular 2?

+0

Vedi anche http://stackoverflow.com/questions/34227194/ handling-404-with-angular2 –

risposta

6

Aggiornamento

Nel nuovo V3 Router è possibile utilizzare le guardie come spiegato nella https://angular.io/guide/router#canactivate-requiring-authentication

originale

penso che si dovrebbe usare @CanActivate() per fare il check. Se in avanti nella @CanActivate() l'URL non valido, non dovrebbe essere aggiunto alla storia (non provato)

Vedi anche https://github.com/angular/angular/issues/4112 per come utilizzare DI in @CanActivate()

+0

Grazie per il link, ho iniettato il router in '@CanActivate()', ma sembra che 'router.navigate' passi alla cronologia quando si naviga verso una pagina non valida direttamente attraverso l'indirizzo del browser barra, causando il ** Back ** bu funzionalità tton da rompere. – Simonxca

+0

Capisco.Un'altra idea sarebbe quella di usare un '' router-outlet> 'non l'ho provato io stesso. Penso di aver postato qualche esempio di codice di recente (non mio) hete su SO –

+1

Ho chiesto ai ragazzi angolari. Possiamo usare 'router.navigateByUrl (url, true)' nel hook '@CanActivate()' per risolvere questo problema. – Simonxca

0

La sua domanda davvero interessante, forse si dovrebbe segnalarlo come caratteristica richiesta. Sarebbe bello avere accesso alle istruzioni del router all'interno del callback loader di RouteDefinition.

È possibile provare a emulare la convalida aggiungendo la route predefinita /** e utilizzando il parametro regex di RouteDefinition in modo che corrisponda solo ai numeri positivi.

3

Ok, questo è già implementato, ma non è ben documentato.

Secondo la documentazione:
router.navigateByUrl(url: string, _skipLocationChange?: boolean) : Promise<any>

Ha un _skipLocationChange parametro che non modificherà la storia.
Questi farà il trucco:

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

3

A partire dal 2 angolare finale questa è la soluzione:

this._router.navigateByUrl('/404', { skipLocationChange: true }) 
Problemi correlati