62

我有一个与此类似的问题,但有所不同。

在这里,我试图为处理程序添加一个事件侦听器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
  });
});

$location.path没有被Angular识别。

另一个问题说我应该调用$apply()范围,但我唯一可用的范围是$rootScope并且调用$apply()它似乎不起作用。

对答案的评论表明可以使用范围

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

但这给了我$rootScope,这是行不通的。

我如何获得角度来重新识别变化$location.path()message有没有更好的方法以我可以更改路径的方式注册回调?

4

4 回答 4

118

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

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

请参阅文档 - ng.$ro​​otScope.Scope

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

于 2013-10-14T12:04:41.307 回答
10

公认的解决方案不是适当的方法。理想情况下,您不需要干扰摘要循环( $apply() 会这样做)。

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

于 2016-06-28T07:58:49.293 回答
1

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

不好的例子:

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

Example well:

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

And so you can correct the problem!

于 2017-05-06T20:52:01.497 回答
0

有没有 $timeout 的解决方案。

在使用 $state.go 之前防止重定向到默认状态

event.preventDefault();
$state.go('root');
于 2017-02-05T16:39:18.370 回答