Angular $ location.path no funciona

Tengo una pregunta similar a esta , pero diferente.

Aquí bash agregar un detector de eventos para un manejador 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 }); }); 

Angular no está reconociendo $location.path .

La otra pregunta dice que debería llamar $apply() en el scope, pero el único ámbito disponible para mí es $rootScope y llamar a $apply() no parece funcionar.

Un comentario sobre la respuesta sugiere que se puede lograr un scope con

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

pero esto me da el $rootScope , que no funciona.

¿Cómo obtengo angular para regociar el cambio en $location.path() ? ¿Hay una forma mejor de registrar una callback de message manera que pueda cambiar la ruta?

Debería ejecutar la expresión como función en el 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()); }); }); }); 

Consulte la documentación – ng. $ RootScope.Scope .

Si desea mejorar la capacidad de prueba, use $console lugar de console e inyéctelo también.

La solución aceptada no es la forma adecuada de hacerlo. Lo ideal sería no tener que interferir con el ciclo de resumen (que $ apply () hace).

La mejor manera, según mi opinión, es llamar a $ location.path () desde MainController. Use $emit - $on para enviarlo al MainController y tener una función llamada $ location.path desde allí. Te redirigirá sin problemas sin tener que interferir con el ciclo de digestión. Espero que esto ayude a alguien.

Tuve el mismo problema, mi error fue que estaba ejecutando mal la directiva ng-click en mi artículo.

Mal ejemplo:

 ... 

Ejemplo bien:

 ... 

¡Y entonces puedes corregir el problema!

Hay una solución sin $ timeout.

Solo evite redirigir al estado predeterminado antes de usar $ state.go

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