Angular $ location.path não está funcionando

Eu tenho uma pergunta semelhante a esta , mas diferente.

Aqui estou tentando adicionar um ouvinte de evento para um manipulador window.postMessage .

 app.run(function ($location, $window, $rootScope) { $window.addEventListener('message', function(e) { $location.path("/abc"); console.log($location.path()); // this prints "/abc" as expected $rootScope.$apply(); // this has no effect $scope = angular.element(document).scope(); // this is the same as $rootScope $scope.$apply(); // so this also has no effect }); }); 

O $location.path não está sendo reconhecido pelo Angular.

A outra pergunta diz que devo chamar $apply() no escopo, mas o único escopo disponível para mim é $rootScope e chamar $apply() parece não funcionar.

Um comentário sobre a resposta sugere que um escopo pode ser obtido com

 $scope = angular.element(document).scope() 

mas isso me dá o $rootScope , que não funciona.

Como obtenho angular para relançar a mudança em $location.path() ? Existe uma maneira melhor de registrar um retorno de chamada de message forma que eu possa mudar o caminho?

Você deve executar a expressão como function no método $apply() como

 app.run(function ($location, $window, $rootScope) { $window.addEventListener('message', function(e) { $rootScope.$apply(function() { $location.path("/abc"); console.log($location.path()); }); }); }); 

Veja a documentação – ng $ rootScope.Scope .

Se você quiser melhorar a testabilidade, use $console vez de console e injete esse object também.

A solução aceita não é a maneira apropriada de fazer isso. O ideal é que você não precise interferir no ciclo de digitação (o que $ apply () faz).

A melhor maneira de acordo comigo é chamar $ location.path () do MainController. Use $emit - $on para enviá-lo para o MainController e ter uma function chamada $ location.path de lá. Ele irá redirecioná-lo na perfeição sem ter que interferir com o ciclo digestivo. Espero que isso ajude alguém.

Eu tive o mesmo problema, meu erro foi que eu estava executando a diretiva ng-click mal no meu item.

Mau exemplo:

 ... 

Exemplo bem:

 ... 

E assim você pode corrigir o problema!

Existe solução sem $ timeout.

Apenas evite redirect para o estado padrão antes de usar $ state.go

 event.preventDefault(); $state.go('root');