J'ai quelques parcours dans mon application AngularJS, j'utilise UI-Router pour le routage entre les états / pages de mon site. Un problème que j'ai, c'est que j'ai des routes conflictuelles en raison d'un paramètre optionnel que j'ai / besoin de la page d'accueil du site.
J'ai un itinéraire pour la page d'accueil ( example.com
) défini plus ou moins comme ça:
$stateProvider .state('home', { url: '/:filter', params: { filter: { squash: true, value: null } } });
Je peux activer cet état en allant à la page d'accueil ( example.com
), ainsi qu'en ajoutant le paramètre optionnel example.com/apples
que j'utilise pour filtrer le contenu sur la page d'accueil.
Mon problème est maintenant que j'ai d'autres routes définies comme /login
, /about
, /help
et en allant dans example.com/login
ou example.com/help
, n'activez que l'état de la home
raison du paramètre /:filter
optionholderholder J'ai défini quelle capture un itinéraire suivant /
.
Une solution de contournement que j'ai essayée est d'ajouter une barre oblique à mes autres définitions de route et les liens url: /login/
et d'activer: example.com/login/
qui fonctionne mais je ne pourrai pas utiliser la directive ui-sref
du routeur UI pour Reportez-vous à mes états par leur nom au lieu de l'URL dans mon application et la barre oblique par défaut semble simplement laide.
Ce que j'essaie d'atteindre est de pouvoir avoir le paramètre facultatif pour la page d'accueil /:filter
et pouvoir continuer mes autres itinéraires /login
, /register
, etc. sans avoir à le contourner en ajoutant des barres obliques.
Est-ce que quelqu'un a été dans cette situation ou une situation similaire avant? Tout un aperçu ou une suggestion est très apprécié. Merci d'avance.
Il existe un exemple de travail
Le point ici est de définir l'état de la maison comme le dernier:
// this url will be registered as first .state('login', { url: "/login", templateUrl: 'tpl.html', }) // this as second .state('about', { url: "/about", templateUrl: 'tpl.html', }) ... // this will be registered as the last .state('home', { url: "/:filter", templateUrl: 'tpl.html', params: { filter: { squash: true, value: null } } })
UI-Router itère les états enregistrés dans cet ordre, et essaie de trouver la première correspondance. De cette façon – tous les autres états (connexion, à propos) auront la priorité de l'état "domestique" …
Vérifiez ici
La meilleure pratique dirait que cela devrait probablement être un paramètre de chaîne de requête plutôt qu'un paramètre d'itinéraire puisque vous l'utilisez pour filtrer les données. Pour ce faire avec ui-router, il suffit de le définir comme suit:
$stateProvider .state('home', { url: '/?filter' });
Maintenant, faites simplement
$state.go('home', {filter: 'apples'})