Cela fait des heures que j'ai commencé à travailler sur ce problème et je n'arrive pas à comprendre la solution.
J'ai une application qui peut amener les utilisateurs à taper l'URL. Dans de tels cas, il n'est pas difficile de croire que l'utilisateur peut entrer une barre oblique de fin. Par exemple,
www.example.com/users/2 et www.example.com/edit/company/123
doivent être traités de la même manière que
www.example.com/users/2/ et www.example.com/edit/company/123/
Cela ne doit être fait que pour gérer le routage d'URL côté client. Je ne suis pas intéressé par la gestion des barres obliques de fin dans les appels de ressources/API. Je ne suis intéressé que par la gestion des barres obliques de fin dans le navigateur.
J'ai donc recherché et trouvé peu de réponses sur le net. La plupart d'entre eux m'ont conduit à la section FAQ du routeur angular-ui.
https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions
Ici, ils nous disent d'écrire une règle, c'est ce que je veux faire, mais cela ne semble pas fonctionner, ou peut-être que je le fais mal.
Voici le plunkr où j'ai ajouté mon code.
http://plnkr.co/edit/fD9q7L?p=preview
J'ai ajouté cela à ma configuration, le reste du code est à peu près le truc de base.
$urlRouterProvider.rule(function($injector, $location) {
//if last charcter is a slash, return the same url without the slash
if($location.$$url[length-1] === '/') {
return $location.$$url.substr(0,$location.$$url.length - 2);
} else {
//if the last char is not a trailing slash, do nothing
return $location.$$url;
}
});
Fondamentalement, je veux rendre la barre oblique de fin facultative, c'est-à-dire que sa présence ou son absence dans la barre d'adresse ne devrait avoir aucun effet sur l'état chargé.
Il y a un lien vers le travail plunker
Et voici la définition de règle mise à jour:
$urlRouterProvider.rule(function($injector, $location) {
var path = $location.path();
var hasTrailingSlash = path[path.length-1] === '/';
if(hasTrailingSlash) {
//if last charcter is a slash, return the same url without the slash
var newPath = path.substr(0, path.length - 1);
return newPath;
}
});
Et ces liens fonctionneront désormais correctement:
<ul class="nav">
<li><a ui-sref="route1">Route 1</a></li>
<li><a ui-sref="route2">Route 2</a></li>
<li><a href="#/route1/">#/route1/</a></li>
<li><a href="#/route2/">#/route2/</a></li>
<li><a href="#/route1" >#/route1</a></li>
<li><a href="#/route2" >#/route2</a></li>
</ul>
La magie pourrait être définie comme ceci: renvoyer la valeur modifiée s'il y a un changement ... sinon ne rien faire ... voir l'exemple
Depuis la version ui-router .2.11 vous pouvez le faire:
$urlMatcherFactoryProvider.strictMode(false);
Cela traitera les URL avec et sans les barres obliques de fin de manière identique.
Je n'ai pas assez de représentant pour un commentaire, alors répondez: -
$urlMatcherFactoryProvider.strictMode(false);
Doit être avant le $stateProvider.state
partie.
urlMatcherFactoryProvider
est obsolète pour v1.x de angular-ui-router.
Utilisez plutôt urlService.config.strictMode
( ng1 , ng2 ).
Il doit toujours être avant $stateProvider.state()
.
myApp.config(function($stateProvider, $urlServiceProvider) {
var homeState = {
name: 'home',
url: '/home',
component: 'xyHome'
};
$urlServiceProvider.config.strictMode(false);
$stateProvider.state(homeState);
});
Salut Vous devez définir strictMode = false
Angular ui-router fournit une méthode pour cela
$urlMatcherFactoryProvider.strictMode(false);
Vous devez définir le mode strict avant d'initialiser l'état $stateProvider.state({})
Pour plus de détails, vous pouvez vous référer à ceci Lien