Je voudrais lire les valeurs des paramètres de requête URL à l'aide d'AngularJS. J'accède au HTML avec l'URL suivante:
http://127.0.0.1:8080/test.html?target=bob
Comme prévu, location.search
c'est "?target=bob"
. Pour accéder à la valeur de target , j'ai trouvé divers exemples répertoriés sur le Web, mais aucun ne fonctionne dans AngularJS 1.0.0rc10. En particulier, les éléments suivants sont tous undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Quelqu'un sait ce qui fonctionnera? (J'utilise $location
comme paramètre pour mon contrôleur)
Mettre à jour:
J'ai posté une solution ci-dessous, mais je n'en suis pas entièrement satisfait. La documentation du Guide du développeur: Services angulaires: Utilisation de $ location indique ce qui suit $location
:
Quand dois-je utiliser $ location?
Chaque fois que votre application doit réagir à une modification de l'URL actuelle ou si vous souhaitez modifier l'URL actuelle dans le navigateur.
Pour mon scénario, ma page sera ouverte à partir d'une page Web externe avec un paramètre de requête, donc je ne "réagis pas à un changement de l'URL actuelle" en soi. Ce $location
n'est peut - être pas le bon outil pour le travail (pour les moindres détails, voir ma réponse ci-dessous). J'ai donc changé le titre de cette question de "Comment lire les paramètres de requête dans AngularJS en utilisant $ location?" à "Quelle est la manière la plus concise de lire les paramètres de requête dans AngularJS?". Évidemment, je pourrais simplement utiliser javascript et l'expression régulière pour analyser location.search
, mais aller à ce niveau bas pour quelque chose de si basique offense vraiment mes sensibilités de programmeur.
Donc: y a-t-il une meilleure façon d'utiliser $location
que je fais dans ma réponse, ou y a-t-il une alternative concise?
http://127.0.0.1:8080/test.html#?target=bob
fonctionnerait, notez le#
avant le?
.$location
est une méthode de routage de deuxième niveau qui n'est pas envoyée au serveur.$location.search()['target']
fonctionne après$locationProvider.html5Mode(true)
avoir été appelé dans un navigateur moderne.Réponses:
Vous pouvez injecter $ routeParams (nécessite ngRoute ) dans votre contrôleur. Voici un exemple tiré de la documentation:
EDIT: Vous pouvez également obtenir et définir des paramètres de requête avec le service $ location (disponible en
ng
), en particulier sasearch
méthode: $ location.search () .$ routeParams sont moins utiles après la charge initiale du contrôleur;
$location.search()
peut être appelé à tout moment.la source
Heureusement que vous avez réussi à le faire fonctionner avec le mode html5 mais il est également possible de le faire fonctionner en mode hashbang.
Vous pouvez simplement utiliser:
pour accéder au paramètre de recherche «cible».
Pour la référence, voici le jsFiddle de travail: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
la source
HTML5Mode(true)
seuls les paramètres après # / sont disponibles ou sont ajoutés à l'url avec # / au début.$location.search()
. Je ne sais pas pourquoi cette réponse les y met.$location.search()
.Pour donner une réponse partielle à ma propre question, voici un exemple de travail pour les navigateurs HTML5:
La clé était d'appeler
$locationProvider.html5Mode(true);
comme ci-dessus. Cela fonctionne maintenant lors de l'ouverturehttp://127.0.0.1:8080/test.html?target=bob
. Je ne suis pas satisfait du fait que cela ne fonctionnera pas dans les anciens navigateurs, mais je pourrais utiliser cette approche de toute façon.Une alternative qui fonctionnerait avec des navigateurs plus anciens serait de supprimer l'
html5mode(true)
appel et d'utiliser à la place l'adresse suivante avec hachage + barre oblique:http://127.0.0.1:8080/test.html#/?target=bob
La documentation pertinente se trouve dans le Guide du développeur: Services angulaires: Utilisation de $ location (étrange que ma recherche Google n'ait pas trouvé cela ...).
la source
ng-controller
attribut de ne doit-il pas<body>
être défini surMyApp
?<base href="https://stackoverflow.com/" />
balise ou ajouterrequireBase: false
un autre paramètre à l'appel à html5Mode. Détails iciCela peut se faire de deux manières:
$routeParams
La meilleure solution recommandée est d'utiliser
$routeParams
dans votre contrôleur. Il nécessite que lengRoute
module soit installé.$location.search()
.Il y a une mise en garde ici. Cela ne fonctionnera qu'avec le mode HTML5. Par défaut, cela ne fonctionne pas pour l'URL qui ne contient pas de hachage (
#
)http://localhost/test?param1=abc¶m2=def
Vous pouvez le faire fonctionner en ajoutant
#/
l'URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
pour retourner un objet comme:la source
$ location.search () ne fonctionnera qu'avec le mode HTML5 activé et uniquement sur le navigateur compatible.
Cela fonctionnera toujours:
$ window.location.search
la source
Juste pour résumer.
Si votre application est chargée à partir de liens externes, angular ne détectera pas cela comme un changement d'URL, donc $ loaction.search () vous donnera un objet vide. Pour résoudre ce problème, vous devez définir ce qui suit dans la configuration de votre application (app.js)
la source
Juste une précision à la réponse d'Ellis Whitehead.
$locationProvider.html5Mode(true);
ne fonctionnera pas avec la nouvelle version d'angularjs sans spécifier l'URL de base de l'application avec une<base href="">
balise ou définir le paramètrerequireBase
surfalse
Du doc :
la source
vous pouvez également utiliser $ location. $$ search.yourparameter
la source
$$search
s'agit d'une variable interne dont l'utilisation n'est pas une si bonne idée.cela peut vous aider
Quelle est la façon la plus concise de lire les paramètres de requête dans AngularJS
la source
J'ai trouvé que pour un SPA HTML5Mode provoque beaucoup de problèmes d'erreur 404, et il n'est pas nécessaire de faire fonctionner $ location.search dans ce cas. Dans mon cas, je veux capturer un paramètre de chaîne de requête d'URL lorsqu'un utilisateur arrive sur mon site, quelle que soit la "page" vers laquelle il se connecte initialement, ET pouvoir les envoyer à cette page une fois connecté. Je capture donc tout ce genre de choses dans app.run
puis plus tard après la connexion, je peux dire $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
la source
C'est un peu tard, mais je pense que votre problème était votre URL. Si au lieu de
tu avais
Je suis presque sûr que cela aurait fonctionné. Angular est vraiment pointilleux sur son # /
la source