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?

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"); });


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


20

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


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.


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");

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.

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.