AngularJS - Como posso fazer um redirecionamento com um carregamento de página completo?


94

Quero fazer um redirecionamento que recarregue a página inteira para que os cookies do meu servidor da web sejam atualizados quando a página carregar. window.location = "/#/Next"e window.location.href = "/#/Next"não funcionam, eles fazem uma rota Angular que não atinge o servidor.

Qual é a maneira correta de fazer uma solicitação completa do servidor em um controlador Angular?


8
Você já resolveu isso?
superjos

7
Você já resolveu isso?
Nolwennig

6
Você já resolveu isso?
Dan Beaulieu

5
Você já resolveu isso?
Minha pilha estourou em

4
Você já resolveu isso?
Shahzain Ali

Respostas:


183

Para <a>tags :

Você precisa manter target="_self"sua <a>marca

Existem três casos em que o AngularJS executará um recarregamento de página inteira:

  • Links que contêm o elemento de destino
    Exemplo:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • Links absolutos que vão para um domínio diferente
    Exemplo:<a href="http://angularjs.org/">link</a>
  • Links começando com '/' que levam a um caminho de base diferente quando a base é definida
    Exemplo:<a href="https://stackoverflow.com/not-my-base/link">link</a>

Usando javascript :

O $locationserviço permite que você altere apenas o URL; não permite que você recarregue a página. Quando você precisa mudar a URL e recarregar a página ou navegar para uma página diferente, por favor use uma API de nível inferior: $window.location.href.

Vejo:


15
$ window.location.href faz a mesma coisa que window.location.href faz. Tenho certeza de que $ window é apenas um serviço de embrulho para janela. De qualquer forma, ambos fazem uma rota angular em vez da atualização completa da página.
Mike Pateras

3
$ window.location.href definitivamente causa uma atualização completa da página, estou fazendo isso no meu aplicativo.
jszobody

3
Eu li a mesma coisa. Não funciona na versão atual do Chrome. Ele faz uma rota angular.
Mike Pateras

1
1.0.6 do CDN. Estou fazendo isso em um retorno de chamada de sucesso $ http.post, se for o caso, embora eu tenha tentado fora do retorno de chamada e obtido os mesmos resultados. Se eu fizer o redirecionamento para "/" (para o qual também tenho uma rota angular definida), ele funciona com a atualização completa da página, mas "/ # / Next" apenas altera a visualização.
Mike Pateras,

5
<a href="..." target="_self">é o que funcionou para mim. obrigado !
Michael

33

Tivemos o mesmo problema, trabalhando a partir do código JS (ou seja, não da âncora HTML). É assim que resolvemos isso:

  1. Se necessário, altere virtualmente o URL atual por meio do $locationserviço. Isso pode ser útil se o seu destino for apenas uma variação do URL atual, para que você possa aproveitar os $locationmétodos auxiliares. Por exemplo, corremos $location.search(..., ...)apenas para alterar o valor de um parâmetro de string de consulta.

  2. Crie o novo URL de destino, usando o atual, $location.url()se necessário. Para funcionar, este novo teve que incluir tudo após o esquema, domínio e porta. Por exemplo, se você deseja mover para:

    http://yourdomain.com/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en

    então você deve definir o URL como em:

    var destinationUrl = '/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en';

    (com a liderança '/'também).

  3. Atribua um novo URL de destino em nível inferior :$window.location.href = destinationUrl;

  4. Forçar recarga, ainda em baixo nível: $window.location.reload();


1
Isso não funciona para mim no Angular 1.3.1 com Chrome 38. O valor de $ window.location.href não muda quando atribuo um caminho ou um URL completo. Apenas $ window.location.assign () funcionou para mim.
FelixM

Tendo os mesmos problemas que Felix, resolvido de uma maneira diferente stackoverflow.com/questions/31137809/…
Soroush Hakami

13

Depois de pesquisar e fornecer uma sessão de acerto e teste, posso resolvê-lo especificando primeiro o url como

$window.location.href = '/#/home/stats';

então recarregue

$window.location.reload();

Isso parece corrigir o problema, mas clicar para trás e para frente no navegador causará muitas inconsistências.
luisluix

9

Eu tive o mesmo problema. Quando eu uso window.location, $window.locationou mesmo <a href="..." target="_self">a rota não atualiza a página. Portanto, os serviços em cache são usados, o que não é o que desejo em meu aplicativo. Resolvi isso adicionando window.location.reload()after window.locationpara forçar a página a recarregar após o roteamento. Este método parece carregar a página duas vezes. Pode ser um truque sujo, mas faz o trabalho. É assim que eu tenho agora:

  $scope.openPage = function (pageName) {
      window.location = '#/html/pages/' + pageName;
      window.location.reload();
  };

1

Tente isto

$window.location.href="#page-name";
$window.location.reload();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.