我有类似于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
回调?
答案 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');