Est-il possible d'avoir un paramètre d'itinéraire facultatif dans l'itinéraire Angular 2? J'ai essayé la syntaxe Angular 1.x dans RouteConfig mais j'ai reçu l'erreur ci-dessous:
"EXCEPTION ORIGINALE: Chemin" / user /: id? "Contient"? "Qui n'est pas autorisé dans une configuration de route."
@RouteConfig([
{
path: '/user/:id?',
component: User,
as: 'User'
}])
javascript
angular
Jeroen
la source
la source
RouteParams
ne pas importer dans un composant, vérifiez ceci: stackoverflow.com/a/36792261/806202 . La solution est d'utiliserActivatedRoute
:route.snapshot.params['routeParam']
De cette façon, le composant n'est pas restitué lorsque le paramètre est ajouté.
la source
pathMatch: 'full'
pour rediriger, sinon des chemins commeusers/admin
sont également redirigés dans mon cas/users/all
ou/users/home
, lisez «tous» ou «accueil» comme leid
et ignorez-le simplement s'il correspond à votre valeur magique. Ensuite, la première ligne ci-dessus devientredirectTo: 'users/home'
ou ce que vous décidez. Pour moi, une barre oblique à la fin se démarque vraiment comme quelque chose qui ne va pas.Il est recommandé d'utiliser un paramètre de requête lorsque les informations sont facultatives.
depuis https://angular.io/guide/router#optional-route-parameters
Il vous suffit de retirer le paramètre du chemin de la route.
la source
Angular 4 - Solution pour traiter la commande du paramètre optionnel:
FAITES CECI:
Notez que les routes
products
etproducts/:id
sont nommées exactement de la même manière. Angular 4 suivra correctementproducts
pour les routes sans paramètre, et si un paramètre il suivraproducts/:id
.Cependant, le chemin de la route sans paramètre ne
products
doit pas avoir de barre oblique à la fin, sinon angular le traitera de manière incorrecte comme un chemin de paramètre. Donc, dans mon cas, j'avais la barre oblique finale pour les produits et cela ne fonctionnait pas.NE FAITES PAS CELA:
la source
data
au composant, qui peut être différent pour chaque route, même vers le même composant. Un exemple{path: 'products', component: ProductsComponent, data: { showAllProducts: true} },
peut être utilisé et ensuite vous vérifiezshowAllProducts
. Un peu plus agréable que de vérifier un null, mais pour les cas plus simples, c'est probablement bien.La réponse de rerezz est plutôt sympa mais elle a un grave défaut. Cela oblige le
User
composant à réexécuter langOnInit
méthode.Cela peut être problématique lorsque vous faites des choses lourdes là-bas et que vous ne voulez pas qu'il soit réexécuté lorsque vous passez de la route non paramétrique à la route paramétrique. Bien que ces deux routes soient destinées à imiter un paramètre d'url facultatif, elles ne deviennent pas 2 routes distinctes.
Voici ce que je suggère pour résoudre le problème:
Vous pouvez ensuite déplacer la logique responsable de la gestion du paramètre vers le
UserWithParam
composant et laisser la logique de base dans leUser
composant. Tout ce que vous faites neUser::ngOnInit
sera pas exécuté à nouveau lorsque vous naviguerez de / user vers / user / 123 .N'oubliez pas de mettre le
<router-outlet></router-outlet>
dans leUser
modèle de.la source
Les réponses suggérées ici, y compris la réponse acceptée de rerezz qui suggèrent d'ajouter plusieurs entrées d'itinéraire fonctionnent correctement .
Cependant, le composant sera recréé lors du passage entre les entrées de route, c'est-à-dire entre l'entrée de route avec le paramètre et l'entrée sans le paramètre.
Si vous voulez éviter cela, vous pouvez créer votre propre calculateur d'itinéraire qui correspondra aux deux itinéraires:
Ensuite, utilisez le matcher dans votre configuration d'itinéraire:
la source
Avec angular4, nous avons juste besoin d'organiser les itinéraires ensemble dans la hiérarchie
Cela fonctionne pour moi. De cette façon, le routeur sait quelle est la prochaine route en fonction des paramètres d'ID d'option.
la source
Ran dans une autre instance de ce problème, et en cherchant une solution, est venu ici. Mon problème était que je faisais les enfants et le chargement paresseux des composants pour optimiser un peu les choses. En bref, si vous chargez paresseusement le module parent. Le principal était mon utilisation de «/: id» dans la route, et je me suis plaint de «/» en faisant partie. Ce n'est pas le problème exact ici, mais cela s'applique.
Routage de l'application depuis le parent
Routes enfants chargées paresseusement
la source
Je ne peux pas commenter, mais en référence à: Paramètre d'itinéraire facultatif Angular 2
une mise à jour pour Angular 6:
Voir https://angular.io/api/router/ActivatedRoute pour plus d'informations sur le routage Angular6.
la source
Face à un problème similaire avec le chargement paresseux, j'ai fait ceci:
Et puis dans le composant:
Par ici:
L'itinéraire sans
/
est redirigé vers l'itinéraire avec. En raison de lapathMatch: 'full'
, seule cette route complète spécifique est redirigée.Ensuite,
users/:id
est reçu. Si l'itinéraire réel étaitusers/
,id
est""
, alors enregistrez-lengOnInit
et agissez en conséquence; sinon,id
est l'identifiant et continuez.Le reste du composant agit sur
selectedUser
est ou non indéfini (* ngIf et les choses comme ça).la source