138 votes

AngularJS : Comment effacer les paramètres d'interrogation dans l'URL ?

Mon application AngularJS doit avoir accès au profil LinkedIn de l'utilisateur. Pour ce faire, je dois rediriger l'utilisateur vers une URL LinkedIn qui contient un paramètre callback redirect_uri qui indiquera à LinkedIn de rediriger l'utilisateur vers ma webapp et d'inclure un paramètre de requête "code" dans l'URL. Il s'agit d'un flux Oauth 2.0 traditionnel.

Tout fonctionne parfaitement, sauf que LinkedIn redirige l'utilisateur vers l'URL suivante :

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

Je voudrais supprimer ?code=XXX&state=YYY de l'URL afin de la rendre propre. L'utilisateur n'a pas besoin de voir les paramètres de requête que j'ai reçus de la redirection LinkedIn.

J'ai essayé $location.absUrl($location.path() + $location.hash()).replace() mais il conserve les paramètres de la requête dans l'URL.

Je n'arrive pas non plus à extraire les paramètres de la requête, par exemple "code", en utilisant ($location.search()).code . Il semble que le fait d'avoir ? avant # dans l'URL ci-dessus trompe Angular.

27voto

Fredric Points 323

Au moment de la rédaction, et comme mentionné précédemment par @Bosh, html5mode doit être true afin d'être en mesure de définir $location.search() et qu'il soit reflété dans l'URL visuel de la fenêtre.

Voir https://github.com/angular/angular.js/issues/1521 pour plus d'informations.

Mais si html5mode es true vous pouvez facilement effacer la chaîne d'interrogation de l'URL avec :

$location.search('');

o

$location.search({});

Cela modifiera également l'URL visuel de la fenêtre.

(Testé dans la version AngularJS 1.3.0-rc.1 con html5Mode(true) .)

12voto

Bosh Points 1469

Il faut que ça marche quand html5mode = false ?

Toutes les autres réponses ne fonctionnent que lorsque l'outil Angular html5mode es true . Si vous travaillez en dehors de html5mode alors $location ne se réfère qu'à la "fausse" localisation qui vit dans votre hash -- et donc $location.search ne peut pas voir/éditer/fixer les paramètres de recherche de la page actuelle.

Voici une solution de contournement, à insérer dans le HTML de la page avant charges angulaires :

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>

5voto

kevinius Points 417

Il suffit d'utiliser

$location.url();

Au lieu de

$location.path();

4voto

luizfelippe Points 21

Si vous voulez passer à une autre URL et effacer les paramètres de la requête, utilisez simplement :

$location.path('/my/path').search({});

1voto

Oswaldo Alvarez Points 26

Si vous utilisez les paramètres des routes, effacez simplement $routeParams.

$routeParams= null;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X