use*_*636 6 events location angularjs rootscope angularjs-digest
所以我有一个AngularJS服务监听一些事件.在处理这些事件时,我需要调用不同的控制器并最终加载新视图.在一个事件处理程序中,我使用$ location.path()然后调用$ rootScope.apply()来触发到控制器的路由.这适用于该事件,但在其他情况下,我收到以下错误:$rootScope:inprog Action Already In Progress.我猜测它在第一个场景中有效,因为$ rootScope.apply()是从侦听器函数内的另一个回调函数调用的,其他处理程序试图仅从事件侦听器函数调用它.
//angular service
$rootScope.$on('MY_EVENT', function (event, msg) {
MyClass.doSomething(msg, function (response) {
$location.path("/view1");
$rootScope.$apply(); //WORKS FINE
});
});
$rootScope.$on('MY_OTHER_EVENT', function (event, msg) {
$location.path("/view2");
$rootScope.$apply(); //ERROR
});
Run Code Online (Sandbox Code Playgroud)
如何让它适用于所有事件处理程序?
aw0*_*w04 11
问题是,它的执行$digest上$rootScope快速连续两次,它抛出的错误时有重叠.要解决这个问题,您可以简单地将两个调用都包装$location.path()进去$timeout,就像您第一次在plnkr示例中所做的那样.这将迫使它等待$digest循环完成.
您也可以删除显式调用$rootScope.$apply().
$rootScope.$on('FIRST_EVENT', function(event, msg) {
$timeout(function() {
$location.path("/view1");
});
});
$rootScope.$on('SECOND_EVENT', function(event, msg) {
$timeout(function() {
$location.path("/view2");
});
});
Run Code Online (Sandbox Code Playgroud)
注意:
此代码基于plnkr示例,该示例与原始帖子中的代码略有不同.
参考:
| 归档时间: |
|
| 查看次数: |
11778 次 |
| 最近记录: |