Angular $ location.path不起作用

Joe*_*Joe 61 angularjs

我有一个类似于这个的问题,但不同.

在这里,我试图为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
  });
});
Run Code Online (Sandbox Code Playgroud)

$location.pathAngular没有承认这一点.

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

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

$scope = angular.element(document).scope()
Run Code Online (Sandbox Code Playgroud)

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

如何通过角度来调整变化$location.path()?是否有更好的方式以message可以更改路径的方式注册回调?

Tho*_*mas 117

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

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

请参阅文档 - ng.$ rootScope.Scope.

如果要提高可测试性,请使用$console而不是console注入并注入该对象.

  • 这对我来说不起作用,因为我得到了一个正在进行的摘要错误.我不明白为什么$ apply应该是必要的,因为你使用$ location服务来煽动它,因此应该知道路径的变化. (5认同)
  • 更新:在我调用$ location.path()之后调用$ location.replace()就行了.不需要$ apply(). (5认同)
  • 非常感谢,非常感谢.(我只是用日志来说明这个问题). (3认同)

Dhr*_*eja 10

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

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