AngularJS UI Router: conflit d'itinéraire en raison du paramètre optionnel

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'})