Me gustaría leer los valores de los parámetros de consulta de URL utilizando AngularJS. Estoy accediendo al HTML con la siguiente URL:
http://127.0.0.1:8080/test.html?target=bob
Como se esperaba, location.search
es "?target=bob"
. Para acceder al valor de target , he encontrado varios ejemplos enumerados en la web, pero ninguno de ellos funciona en AngularJS 1.0.0rc10. En particular, los siguientes son todos undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Alguien sabe lo que funcionará? (Estoy usando $location
como parámetro para mi controlador)
Actualizar:
He publicado una solución a continuación, pero no estoy completamente satisfecho con ella. La documentación en la Guía del desarrollador: Servicios angulares: el uso de $ location establece lo siguiente sobre $location
:
¿Cuándo debo usar $ location?
Cada vez que su aplicación necesite reaccionar a un cambio en la URL actual o si desea cambiar la URL actual en el navegador.
Para mi escenario, mi página se abrirá desde una página web externa con un parámetro de consulta, por lo que no estoy "reaccionando a un cambio en la URL actual" per se. Entonces, tal vez $location
no sea la herramienta adecuada para el trabajo (para los detalles feos, vea mi respuesta a continuación). Por lo tanto, he cambiado el título de esta pregunta de "¿Cómo leer los parámetros de consulta en AngularJS usando $ location?" a "¿Cuál es la forma más concisa de leer los parámetros de consulta en AngularJS?". Obviamente, podría usar JavaScript y expresiones regulares para analizar location.search
, pero ir a ese nivel bajo para algo tan básico realmente ofende la sensibilidad de mi programador.
Entonces: ¿hay una mejor manera de usar $location
que yo en mi respuesta, o hay una alternativa concisa?
http://127.0.0.1:8080/test.html#?target=bob
funcionaría, observe el#
antes de la?
.$location
es un método de enrutamiento de segundo nivel que no se envía al servidor.$location.search()['target']
funciona después de$locationProvider.html5Mode(true)
haber sido llamado en un navegador moderno.Respuestas:
Puede inyectar $ routeParams (requiere ngRoute ) en su controlador. Aquí hay un ejemplo de los documentos:
EDITAR: También puede obtener y establecer parámetros de consulta con el servicio $ location (disponible en
ng
), particularmente susearch
método: $ location.search () .$ routeParams son menos útiles después de la carga inicial del controlador;
$location.search()
Se puede llamar en cualquier momento.fuente
Es bueno que hayas logrado que funcione con el modo html5, pero también es posible hacerlo funcionar en el modo hashbang.
Simplemente podrías usar:
para acceder al parámetro de búsqueda 'objetivo'.
Para la referencia, aquí está el jsFiddle de trabajo: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
fuente
HTML5Mode(true)
, solo los parámetros después de # / están disponibles o se agregan a la url con # / al principio.$location.search()
. No estoy seguro de por qué esta respuesta los pone allí.$location.search()
.Para dar una respuesta parcial a mi propia pregunta, aquí hay una muestra de trabajo para navegadores HTML5:
La clave era llamar
$locationProvider.html5Mode(true);
como se hizo anteriormente. Ahora funciona al abrirhttp://127.0.0.1:8080/test.html?target=bob
. No estoy contento con el hecho de que no funcionará en navegadores antiguos, pero podría usar este enfoque de todos modos.Una alternativa que funcionaría con los navegadores más antiguos sería abandonar la
html5mode(true)
llamada y usar la siguiente dirección con hash + barra diagonal:http://127.0.0.1:8080/test.html#/?target=bob
La documentación relevante se encuentra en la Guía del desarrollador: Servicios angulares: Uso de $ location (extraño que mi búsqueda en Google no haya encontrado esto ...).
fuente
ng-controller
atributo de<body>
ajustarse aMyApp
?<base href="https://stackoverflow.com/" />
etiqueta o agregarrequireBase: false
como otro parámetro a la llamada a html5Mode. Detalles aquíSe puede hacer de dos maneras:
$routeParams
La mejor solución recomendada es usarla
$routeParams
en su controlador. RequierengRoute
que se instale el módulo.$location.search()
.Hay una advertencia aquí. Solo funcionará con el modo HTML5. Por defecto, no funciona para la URL que no tiene hash (
#
)http://localhost/test?param1=abc¶m2=def
Puede hacerlo funcionar agregando
#/
la URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
para devolver un objeto como:fuente
$ location.search () funcionará solo con el modo HTML5 activado y solo en el navegador compatible.
Esto funcionará siempre:
$ window.location.search
fuente
Solo para veranear.
Si su aplicación se está cargando desde enlaces externos, entonces angular no detectará esto como un cambio de URL, por lo que $ loaction.search () le dará un objeto vacío. Para resolver esto, debe establecer lo siguiente en la configuración de su aplicación (app.js)
fuente
Solo una precisión a la respuesta de Ellis Whitehead.
$locationProvider.html5Mode(true);
no funcionará con la nueva versión de angularjs sin especificar la URL base para la aplicación con una<base href="">
etiqueta o establecer el parámetrorequireBase
enfalse
Del documento :
fuente
también puede usar $ location. $$ search.yourparameter
fuente
$$search
es una variable interna, cuyo uso no es una buena idea.esto puede ayudarte
¿Cuál es la forma más concisa de leer los parámetros de consulta en AngularJS?
fuente
Encontré que para un SPA HTML5Mode causa muchos problemas de error 404, y no es necesario hacer que $ location.search funcione en este caso. En mi caso, quiero capturar un parámetro de cadena de consulta de URL cuando un usuario visita mi sitio, independientemente de la "página" a la que se vincule inicialmente, Y poder enviarlos a esa página una vez que inicien sesión. Así que simplemente capturo todos esas cosas en app.run
luego, después de iniciar sesión, puedo decir $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
fuente
Es un poco tarde, pero creo que tu problema fue tu URL. Si en lugar de
tu tenias
Estoy bastante seguro de que hubiera funcionado. Angular es muy exigente con su # /
fuente