AngularJS: comment effacer les paramètres de requête dans L'URL?

Mon application AngularJS doit avoir accès au profil LinkedIn de l'utilisateur. Pour ce faire, j'ai besoin de rediriger l'utilisateur vers une URL LinkedIn qui contient un paramètre de rappel 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. C'est un flux OAuth 2.0 traditionnel.

Tout fonctionne très bien 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 le rendre propre. L'utilisateur n'a pas besoin de voir les paramètres de requête que j'ai reçus de LinkedIn redirect.

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

Je suis également incapable d'extraire les paramètres de requête, par exemple "code", en utilisant ($location.search()).code. Il semble comme avoir ? avant # dans L'URL ci-dessus est trompeur angulaire.

123
demandé sur simeg 2013-06-29 07:34:00

15 réponses

J'utilise

$location.search('key', null)

Car cela supprime non seulement ma clé, mais la supprime de la visibilité sur L'URL.

140
répondu Julius 2015-02-28 09:45:23

J'ai fini par obtenir la réponse du Forum AngularJS. Voir ce fil pour plus de détails


Le lien est vers un fil de discussion Google Groups, qui est difficile à lire et ne fournit pas de réponse claire. Pour supprimer les paramètres D'URL, utilisez

$location.url($location.path());
99
répondu alecswan 2013-12-20 16:45:02

Pour supprimer Tous les paramètres de requête , procédez comme suit:

$location.search({});

Pour supprimer un paramètre de requête particulier , procédez comme suit:

$location.search('myQueryParam', null);
57
répondu Rahul Desai 2017-12-04 18:07:42

Pour effacer un élément supprimez-le et appelez $ $ compose

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

Dérivé de angularjs source: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443

28
répondu basarat 2014-01-31 04:55:14

Vous pouvez supprimer un paramètre de requête spécifique en utilisant:

delete $location.$$search.nameOfParameter;

Ou vous pouvez effacer tous les paramètres de requête en définissant la recherche sur un objet vide:

$location.$$search = {};
27
répondu Quintin 2013-10-06 20:24:56

Au moment de l'écriture, et comme mentionné précédemment par @Bosh, html5mode doit être true afin de pouvoir définir $location.search() et l'avoir reflété dans L'URL visuelle de la fenêtre.

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

, Mais si html5mode est true vous pouvez facilement effacer l'URL de la chaîne de requête avec:

$location.search('');

Ou

$location.search({});

Cela modifiera également L'URL visuelle de la fenêtre.

(testé dans Version AngularJS 1.3.0-rc.1 avec html5Mode(true).)

26
répondu Fredric 2014-10-13 08:46:20

Besoin pour le faire fonctionner quand html5mode = false?

Toutes les autres réponses ne fonctionnent que lorsque Angulaire de la html5mode est true. Si vous travaillez en dehors de html5mode, alors $location se réfère uniquement à l'emplacement "faux" qui vit dans votre hachage-et donc $location.search ne peut pas voir/modifier/corriger les paramètres de recherche de la page réelle.

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>
12
répondu Bosh 2014-06-10 05:54:46

Il suffit d'utiliser

$location.url();

Au Lieu de

$location.path();
4
répondu kevinius 2015-12-20 16:09:49

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

$location.path('/my/path').search({});
3
répondu luizfelippe 2017-08-23 20:45:38

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

$routeParams= null;
1
répondu Oswaldo Alvarez 2014-10-22 04:06:26

Que diriez-vous de simplement définir le hachage d'emplacement sur null

$location.hash(null);
0
répondu Bwyss 2015-04-24 14:59:31

Si vous traitez les paramètres immédiatement, puis passez à la page suivante, vous pouvez mettre un point d'interrogation à la fin du nouvel emplacement.

Par exemple, si vous auriez fait $emplacement.le chemin d'accès ('/nextPage');

Vous pouvez le faire à la place: $emplacement.chemin ('/nextPage?');

0
répondu user5487176 2015-10-25 22:50:40

J'ai essayé les réponses ci-dessus mais je n'ai pas pu les faire fonctionner. Le seul code qui a fonctionné pour moi était $window.location.search = ''

0
répondu Gwen Au 2016-02-09 00:49:14

Je peux remplacer tous les paramètres de requête avec cette seule ligne: $location.search({});
Facile à comprendre et facile à effacer.

0
répondu Lucas Reppe Welander 2016-06-28 08:56:55

La réponse acceptée a fonctionné pour moi, mais j'avais besoin de creuser un peu plus profond pour résoudre les problèmes avec le bouton de retour.

Ce que j'ai remarqué, c'est que si je crée un lien vers une page en utilisant <a ui-sref="page({x: 1})">, puis supprime la chaîne de requête en utilisant $location.search('x', null), Je ne reçois pas d'entrée supplémentaire dans Mon historique de navigateur, donc le bouton Retour me ramène à l'endroit où j'ai commencé. Bien que je pense que c'est faux parce que je ne pense pas Qu'Angular devrait automatiquement supprimer cette entrée d'historique pour moi, c'est en fait le comportement souhaité pour mon cas d'utilisation.

Le problème est que si je crée un lien vers la page en utilisant <a href="/page/?x=1"> à la place, puis supprime la chaîne de requête de la même manière, jefais obtenir une entrée supplémentaire dans Mon historique de navigateur, donc je dois cliquer sur le bouton Précédent deux fois pour revenir à l'endroit où j'ai commencé. C'est un comportement incohérent, mais en fait cela semble plus correct.

Je peux facilement résoudre le problème avec les liens href en utilisant $location.search('x', null).replace(), mais cela casse la page lorsque vous atterrissez dessus via un ui-sref lien, si ce n'est pas bon.

Après beaucoup de Tripotage, c'est le correctif que j'ai trouvé:

Dans la fonction run de mon application, j'ai ajouté ceci:

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

Ensuite, j'utilise ce code pour supprimer le paramètre de chaîne de requête:

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}
0
répondu Moo 2016-11-11 13:45:34