Meu aplicativo AngularJS precisa ter acesso ao perfil do usuário no LinkedIn. Para fazer isso, preciso redirecionar o usuário para uma URL do LinkedIn que contenha um parâmetro de retorno de chamada redirect_uri que instruirá o LinkedIn a redirecionar o usuário de volta ao meu aplicativo da web e incluir um parâmetro de consulta "código" no URL. É um fluxo tradicional do Oauth 2.0.
Tudo funciona muito bem, exceto que o LinkedIn redireciona o usuário de volta para o seguinte URL:
http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites
Gostaria de remover ?code=XXX&state=YYY
do URL para torná-lo limpo. O usuário não precisa ver os parâmetros de consulta que recebi do redirecionamento do LinkedIn.
Eu tentei $location.absUrl($location.path() + $location.hash()).replace()
, mas ele mantém os parâmetros de consulta na URL.
Também não consigo extrair os parâmetros de consulta, por exemplo, "código", usando ($location.search()).code
. Parece ter? antes de # no URL acima estar enganando Angular.
Acabei recebendo a resposta do fórum AngularJS. Veja este tópico para detalhes
O link é para um segmento dos Grupos do Google, que é difícil de ler e não fornece uma resposta clara. Para remover os parâmetros de URL, use
fonte
The link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Para remover TODOS os parâmetros de consulta, faça:
Para remover UM parâmetro de consulta específico, faça:
fonte
undefined
, caso você esteja evitando usarnull
como eu.Para limpar um item, exclua-o e chame $$ componete
derivado da fonte angularjs: https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443
fonte
search
método. docs.angularjs.org/api/ng/service/$location#searchVocê pode excluir um parâmetro de consulta específico usando:
Ou você pode limpar todos os parâmetros de consulta configurando a pesquisa para um objeto vazio:
fonte
$location.$$search = {}
sejam executados). A solução @basarat está funcionando bem.No momento da redação deste artigo, e como mencionado anteriormente pelo @Bosh,
html5mode
étrue
necessário poder definir$location.search()
e refletir a URL visual da janela.Consulte https://github.com/angular/angular.js/issues/1521 para obter mais informações.
Mas se
html5mode
for,true
você pode facilmente limpar a string de consulta da URL com:ou
Isso também altera o URL visual da janela.
(Testado na versão AngularJS
1.3.0-rc.1
comhtml5Mode(true)
.)fonte
Precisa fazê-lo funcionar quando
html5mode
=false
?Todas as outras respostas funcionam apenas quando Angular
html5mode
étrue
. Se você trabalha forahtml5mode
,$location
refere - se apenas ao local "falso" que reside no seu hash - e, portanto,$location.search
não pode ver / editar / corrigir os parâmetros de pesquisa da página real.Aqui está uma solução alternativa, a ser inserida no HTML da página antes do carregamento angular:
fonte
myapp/#?client=clientName
vez demyapp/?client=clientName
Apenas use
Ao invés de
fonte
Se você deseja mover para outro URL e limpar os parâmetros de consulta, basta usar:
fonte
Se você estiver usando parâmetros de rotas, limpe $ routeParams
fonte
$routeParams
comonull
. Na verdade, não afetará os parâmetros de URL na barra de endereço.Que tal apenas definir o hash do local como nulo
fonte
se você processar os parâmetros imediatamente e passar para a próxima página, poderá colocar um ponto de interrogação no final do novo local.
por exemplo, se você tivesse feito $ location.path ('/ nextPage');
você pode fazer isso: $ location.path ('/ nextPage?');
fonte
Eu tentei as respostas acima, mas não consegui fazê-las funcionar. O único código que funcionou para mim foi
$window.location.search = ''
fonte
Posso substituir todos os parâmetros de consulta por esta única linha:
$location.search({});
Fácil de entender e fácil de limpá-los.
fonte
A resposta aceita funcionou para mim, mas eu precisava me aprofundar um pouco mais para corrigir os problemas com o botão Voltar.
O que eu notei é que, se eu vincular uma página usando
<a ui-sref="page({x: 1})">
e remover a string de consulta usando$location.search('x', null)
, não recebo uma entrada extra no histórico do navegador; portanto, o botão Voltar me leva de volta para onde comecei. Embora eu ache que isso esteja errado, porque não acho que o Angular remova automaticamente essa entrada do histórico para mim, esse é realmente o comportamento desejado para o meu caso de uso específico.O problema é que se eu ligar para a página usando
<a href="https://stackoverflow.com/page/?x=1">
em vez disso, em seguida, remover a string de consulta da mesma forma, eu faço obter uma entrada extra no meu histórico do navegador, então eu tenho que clicar no botão Voltar duas vezes para voltar para onde eu comecei . Esse é um comportamento inconsistente, mas na verdade isso parece mais correto.Posso corrigir facilmente o problema com os
href
links usando$location.search('x', null).replace()
, mas isso interrompe a página quando você acessa a página por meio de umui-sref
link, então isso não é bom.Depois de muitas brincadeiras, essa é a solução que eu criei:
Na
run
função do meu aplicativo, adicionei isso:Então eu uso esse código para remover o parâmetro da string de consulta:
fonte
Para Angular> 2 , você pode passar nulo a todos os parâmetros que deseja limpar
fonte