Eu gostaria de ler os valores dos parâmetros de consulta de URL usando AngularJS. Estou acessando o HTML com o seguinte URL:
http://127.0.0.1:8080/test.html?target=bob
Como esperado, location.search
é "?target=bob"
. Para acessar o valor do target , encontrei vários exemplos listados na Web, mas nenhum deles funciona no AngularJS 1.0.0rc10. Em particular, são todos os seguintes undefined
:
$location.search.target
$location.search['target']
$location.search()['target']
Alguém sabe o que vai funcionar? (Estou usando $location
como parâmetro para o meu controlador)
Atualizar:
Publiquei uma solução abaixo, mas não estou totalmente satisfeito com ela. A documentação do Developer Guide: Angular Services: Using $ location indica o seguinte sobre $location
:
Quando devo usar $ location?
Sempre que seu aplicativo precisar reagir a uma alteração no URL atual ou se você desejar alterar o URL atual no navegador.
Para o meu cenário, minha página será aberta a partir de uma página da Web externa com um parâmetro de consulta, por isso não estou "reagindo a uma alteração no URL atual" por si só. Portanto, talvez $location
não seja a ferramenta certa para o trabalho (para os detalhes feios, veja minha resposta abaixo). Portanto, mudei o título desta pergunta de "Como ler os parâmetros de consulta no AngularJS usando $ location?" para "Qual é a maneira mais concisa de ler parâmetros de consulta no AngularJS?". Obviamente, eu poderia apenas usar javascript e expressão regular para analisar location.search
, mas ir para um nível tão baixo para algo tão básico realmente ofende minhas sensibilidades de programador.
Então: existe uma maneira melhor de usar $location
do que na minha resposta ou existe uma alternativa concisa?
http://127.0.0.1:8080/test.html#?target=bob
funcionaria, observe o#
antes do?
.$location
é um método de roteamento de segundo nível que não é enviado ao servidor.$location.search()['target']
funciona depois de$locationProvider.html5Mode(true)
ter sido chamado em um navegador moderno.Respostas:
Você pode injetar $ routeParams (requer ngRoute ) no seu controlador. Aqui está um exemplo dos documentos:
EDIT: Você também pode obter e definir parâmetros de consulta com o serviço $ location (disponível em
ng
), particularmente seusearch
método: $ location.search () .$ routeParams são menos úteis após o carregamento inicial do controlador;
$location.search()
pode ser chamado a qualquer momento.fonte
É bom que você tenha conseguido fazê-lo funcionar com o modo html5, mas também é possível fazê-lo funcionar no modo hashbang.
Você pode simplesmente usar:
para obter acesso ao parâmetro de pesquisa 'target'.
Para referência, aqui está o jsFiddle em funcionamento: http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/
fonte
HTML5Mode(true)
, apenas os parâmetros após # / estarão disponíveis ou serão adicionados ao URL com # / no início.$location.search()
. Não sei por que essa resposta os coloca lá.$location.search()
.Para dar uma resposta parcial à minha própria pergunta, aqui está um exemplo de trabalho para navegadores HTML5:
A chave era ligar
$locationProvider.html5Mode(true);
como feito acima. Agora funciona ao abrirhttp://127.0.0.1:8080/test.html?target=bob
. Não estou feliz com o fato de que ele não funcionará em navegadores mais antigos, mas posso usar essa abordagem de qualquer maneira.Uma alternativa que funcionaria com navegadores mais antigos seria encerrar a
html5mode(true)
chamada e usar o seguinte endereço com barra + hash:http://127.0.0.1:8080/test.html#/?target=bob
A documentação relevante está no Guia do desenvolvedor: Serviços angulares: usando $ location (estranho que minha pesquisa no google não encontrou isso ...).
fonte
ng-controller
atributo de não deve<body>
ser definido comoMyApp
?<base href="https://stackoverflow.com/" />
tag ou adicionarrequireBase: false
outro parâmetro à chamada para html5Mode. Detalhes aquiIsso pode ser feito de duas maneiras:
$routeParams
A solução melhor e recomendada é usar
$routeParams
no seu controlador. Requer ongRoute
módulo a ser instalado.$location.search()
.Há uma ressalva aqui. Funcionará apenas no modo HTML5. Por padrão, ele não funciona para o URL que não possui hash (
#
).http://localhost/test?param1=abc¶m2=def
Você pode fazer isso adicionando
#/
o URL.http://localhost/test#/?param1=abc¶m2=def
$location.search()
para retornar um objeto como:fonte
$ location.search () funcionará apenas com o modo HTML5 ativado e apenas no navegador de suporte.
Isso sempre funcionará:
$ window.location.search
fonte
Apenas para o verão.
Se o seu aplicativo estiver sendo carregado a partir de links externos, o angular não detectará isso como uma alteração de URL, para que $ loaction.search () forneça um objeto vazio. Para resolver isso, é necessário definir o seguinte na configuração do seu aplicativo (app.js)
fonte
Apenas uma precisão para a resposta de Ellis Whitehead.
$locationProvider.html5Mode(true);
não funcionará com a nova versão do angularjs sem especificar o URL base do aplicativo com uma<base href="">
tag ou definir o parâmetrorequireBase
comofalse
Do documento :
fonte
você também pode usar $ location. $$ search.yourparameter
fonte
$$search
é uma variável interna, cuja utilização não é uma boa idéia.isso pode ajudar você
Qual é a maneira mais concisa de ler parâmetros de consulta no AngularJS
fonte
Descobri que para um SPA o HTML5Mode causa muitos problemas de erro 404, e não é necessário fazer com que $ location.search funcione nesse caso. No meu caso, quero capturar um parâmetro de string de consulta de URL quando um usuário chega ao meu site, independentemente de qual "página" ele vincular inicialmente, e ser capaz de enviá-lo para essa página assim que efetuar o login. essas coisas no app.run
depois, após o login, posso dizer $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)
fonte
É um pouco tarde, mas acho que seu problema foi o seu URL. Se em vez de
você tinha
Tenho certeza de que teria funcionado. Angular é realmente exigente quanto ao seu # /
fonte