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.
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.
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());
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);
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
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 = {};
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)
.)
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>
Il suffit d'utiliser
$location.url();
Au Lieu de
$location.path();
Si vous voulez passer à une autre URL et effacer les paramètres de requête, utilisez simplement:
$location.path('/my/path').search({});
Si vous utilisez des paramètres de routes, effacez simplement $ routeParams
$routeParams= null;
Que diriez-vous de simplement définir le hachage d'emplacement sur null
$location.hash(null);
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?');
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 = ''
Je peux remplacer tous les paramètres de requête avec cette seule ligne: $location.search({});
Facile à comprendre et facile à effacer.
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();
}