Gestion des barres obliques de fin dans le routeur angularUI

Cela fait des heures que j'ai commencé à travailler sur ce problème et je n'arrive pas à trouver la solution.

J'ai une application qui peut entraîner des utilisateurs en tapant réellement L'URL. Dans de tels cas, il n'est pas difficile de croire que l'utilisateur peut saisir une barre oblique. Par exemple,

Www.example.com/users/2 et www.example.com/edit/company/123

Doit être traité 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 du côté client. Je ne suis pas intéressé par la gestion des barres obliques finales dans les appels de ressources/API. Je ne suis intéressé que par la gestion des barres obliques dans le navigateur.

J'ai donc fait des recherches et n'ai pas trouvé beaucoup 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, 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é ceci à 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 finale facultative, c'est-à-dire que sa présence ou son absence sur la barre d'adresse ne devrait avoir aucun effet sur l'état charger.

30
demandé sur Kenster 2014-06-26 04:12:19

5 réponses

Il y a un lien vers le travail plunker

Et c'est la définition de la 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 vont maintenant fonctionner 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: renvoyez la valeur changed s'il y a un changement... sinon ne rien faire... voir l'exemple

25
répondu Radim Köhler 2014-06-26 05:58:21

À partir de la version ui-router 0.2.11 vous pouvez le faire:

$urlMatcherFactoryProvider.strictMode(false);

Cela traitera les URL avec et sans barres obliques de fin de manière identique.

13
répondu othermachines 2015-11-10 20:47:13

Je n'ai pas assez de Représentant pour un commentaire afin de faire une réponse: -

$urlMatcherFactoryProvider.strictMode(false);

Doit être avant la partie $stateProvider.state.

6
répondu openJT 2016-06-27 14:53:33

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 à ce lien

1
répondu abhaygarg12493 2017-04-11 11:28:54

urlMatcherFactoryProvider est obsolète pour v1.x de angular-ui-router.

Utiliser urlService.config.strictMode (ng1, ng2) à la place.

Il doit encore être avant $stateProvider.state().

myApp.config(function($stateProvider, $urlServiceProvider) {
  var homeState = {
    name: 'home',
    url: '/home',
    component: 'xyHome'
  };

  $urlServiceProvider.config.strictMode(false);

  $stateProvider.state(homeState);

});

1
répondu tbmpls 2017-06-22 05:52:06