Il existe un concept fondamental de routage dans Angular 4 que je ne comprends pas.
index.html :
<base href="/">
Structure du fichier:
- app
|- app.routings.ts
|- collections
|-- collection.component.ts
|-- collection.component.html
|-- collectioninfo.component.ts
|-- collectioninfo.component.html
|- shared
|-- header.component.html
|-- header.component.ts
J'ai un lien dans mon header.component.html:
<a class="nav-link" [routerLink]="['/collections']">
Collections
</a>
Si je clique dessus, je débarque sur localhost: 4200/collections. Lorsque l'utilisateur clique sur un bouton, l'URL est modifiée par programme (dans collection.component.ts):
this.router.navigate(['/collections/', collection.name]);
Je me retrouve sur localhost: 4200/collections/name - tout va bien. Maintenant, je souhaite par programme revenir à/collections (dans collectioninfo.component.ts):
this.router.navigate(['/collections']);
Mais ça ne marche pas. L'URL ne change pas et j'obtiens une erreur disant qu'un paramètre n'a pas pu être chargé. Apparemment,/collections/name est chargé à nouveau. Je pensais que c'était un problème de chemin, mais des choses comme celle-ci ne fonctionnent pas non plus:
this.router.navigate(['../collections']);
Informations supplémentaires: Lorsque je recharge manuellement la page alors que je suis sur/collections, je suis de nouveau transféré vers la page d'accueil, mais je pense que c'est un autre problème qui n'est pas lié à ce comportement.
app.routing.ts :
const APP_ROUTES: Routes = [
...
{ path: 'collections', component: CollectionComponent },
{ path: 'collections/:id', component: CollectionInfo },
];
Il s'avère que mon code firebase est foiré - il essaie de recharger la page avant de passer à un autre itinéraire. Cela a provoqué une erreur, car certains paramètres transférés depuis la route précédente étaient manquants.
export const routing = RouterModule.forRoot(APP_ROUTES, { enableTracing: true })
in app.routing.ts était très utile pour le débogage.
Dans votre chemin relatif, this.router.navigate(['../collections']);
, vous essayez de naviguer vers localhost:4200/collections/collections
. Essayez this.router.navigate(['../']);
Si cela ne fonctionne pas, fournissez également ActivatedRoute en tant que paramètre relativeTo:
constructor(route: ActivatedRoute, router: Router) {}
navigate() {
this.router.navigate(['../'], { relativeTo: this.route });
}
relativeTo
fonctionne en créant un chemin relatif à l’entrée que vous fournissez, et il n’est pas nécessairement nécessaire que ce soit l’itinéraire actuel.