Redirecionar usando AngularJS

86

Estou tentando redirecionar para outra rota usando:

$location.path("/route");

Mas por algum motivo não está funcionando. Fiz um widget autocompletar usando jQuery-UI e estou chamando uma função do escopo assim que o usuário seleciona uma opção. Eu depurei e ele entra na função, mas nunca é redirecionado para a outra rota. Só muda a rota quando pressiono uma tecla.

Acho meio estranho, mas ainda não descobri como resolver isso. eu usei

window.location = "#/route";

e funciona, mas eu quero usar a path()função.

Alguém tem ideia do por que isso está acontecendo?

Tomarto
fonte

Respostas:

109

Com um exemplo de código que não funciona, será fácil responder a essa pergunta, mas com essas informações, o melhor que posso pensar é que você está chamando $ location.path fora do resumo do AngularJS.

Tente fazer isso na diretiva scope.$apply(function() { $location.path("/route"); });

Renan Tomal Fernandes
fonte
Muito obrigado e sinto muito por não postar o exemplo que não funciona. Mas era disso que meu código precisava.
Tomarto
23
Alguma ideia de como fazer isso funcionar no método .success dentro de uma solicitação $ http? @Tomarto
Nicholas Kreidberg
2
no console do firefox (30 ~) dispara um erro
informando
1
Como é que isso deveria funcionar? Estou recebendo o seguinte erro: Erro: [$ rootScope: inprog] $ aplicar já em andamento errors.angularjs.org/1.2.15/$rootScope/inprog?p0=%24aplicar no angular.js: 78 ..... portanto, não está funcionando como windows.location = '' ..
Vaibhav
1
@NicholasKreidberg tinha a mesma pergunta e apenas adicionando $ scope. $ Apply (); logo após $ location.path ("/ route"); trabalhou para mim.
Ernesto Allely
82

Não se esqueça de injetar $locationno controlador.

Stepan Suvorov
fonte
2
Boa pegada - esse era o meu problema.
Jason Swett de
Legal, obrigado por postar isso, o que parecia tão óbvio não era.
Chuck Conway,
20

Supondo que você não esteja usando roteamento html5, tente $location.path("route"). Isso redirecionará seu navegador para o #/routequal você deseja.

dpactri
fonte
15

Se você precisar redirecionar para fora do seu aplicativo angular, use $window.location. Esse foi o meu caso; espero que alguém o ache útil.

Raulucco
fonte
2

Verifique seu método de roteamento:

se o seu estado de roteamento é assim

 .state('app.register', {
    url: '/register',
    views: {
      'menuContent': {
        templateUrl: 'templates/register.html',
      }
    }
  }) 

então você deve usar

$location.path("/app/register");
jfindley
fonte
0

É difícil dizer sem conhecer seu código. Meu melhor palpite é que oonchange evento não está disparando quando você altera o valor da caixa de texto do código JavaScript.

Existem duas maneiras de fazer isso funcionar; o primeiro é ligaronchange sozinho e a segunda é esperar que a caixa de texto perca o foco.

Verifique esta questão ; mesmo problema, estrutura diferente.

Milan Jaric
fonte