Angular $ location.path不起作用

时间:2013-10-14 11:47:59

标签: angularjs

我有类似于this one的问题,但不同。

这里我试图为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无法识别$location.path

另一个问题是我应该在范围内调用$apply(),但我可用的唯一范围是$rootScope,并且调用$apply()似乎不起作用。< / p>

对答案的评论表明,范围可以通过

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

但这给了我$rootScope,但这不起作用。

我如何获得角度来重新定位$location.path()中的变化?是否有更好的方式以我可以更改路径的方式注册message回调?

4 个答案:

答案 0 :(得分:116)

您应该在$apply()方法中将表达式作为函数运行,如

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

请参阅documentation - ng.$rootScope.Scope

如果您想提高可测试性,请使用$console代替console并注入该对象。

答案 1 :(得分:9)

接受的解决方案不适合这样做。理想情况下,您不应该干扰摘要周期($ apply()会这样做。)

根据我的最佳方式是从MainController调用$ location.path()。使用$emit - $on将其发送到MainController并从那里调用$ location.path函数。 它将完美地重定向您,而不必干扰消化周期。 我希望这有助于某人。

答案 2 :(得分:1)

我有同样的问题,我的错误是我在我的项目上严重运行ng-click指令。

错误的例子:

<a **href="#"** ng-click="myFunctionChangeLocationPath()">...

示例井:

<a ng-click="myFunctionChangeLocationPath()">...

所以你可以纠正这个问题!

答案 3 :(得分:0)

没有$ timeout的解决方案。

在使用$ state.go

之前,只需阻止重定向到默认状态
event.preventDefault();
$state.go('root');