2013-05-18 21 views
3

我有一些像这样的代码:AngularJS:承诺完成后如何预防事件()的事件?

$scope.$on("$locationChangeStart", function(event, newPath, oldPath) { 

    // Do some sync checks 
    if (!$scope.isPageAllowed($location.path())) 
    { 
     // Prevent default for some reason 
     event.preventDefault(); 
    } 
}); 

当我试图解决promises这样的:

$scope.$on("$locationChangeStart", function(event, newPath, oldPath) { 

    // Do some async checks 
    $scope.fooPromises().then(function (data) { 

     // Prevent default for some reason when promises resolved (only if resolved) 
     event.preventDefault(); 
    }); 
}); 

我得到了全成event(因为异步执行的),过了一会防止eventpromises已解决。

有没有方法可以将event与我的promises连接起来,所以在函数结束后解决promise而不是streight后,会有什么问题呢?

回答

6

对不起,这不起作用:-)。事件纯粹是同步的。

您正在寻找$ route.resolve。异步解析/拒绝路由,给控制器数据或只是检查某些东西。

http://www.egghead.io/video/Kr1qZ8Ik9G8

+0

感谢您的答复@安迪乔斯林,我发现这个解决办法,但有问题的位置。当我拒绝承诺时,没有任何行动如预期那样被解雇,但URL仍然发生了变化。所以这就是我查看$ locationChangeStart事件的原因 - 它在位置路径更改之前正好触发,所以我可以阻止来自视觉更改(无闪烁)的URL。如果有拒绝解决的情况也可以防止URL更改 - 您的帮助将非常感激。 (对不起,如果是的话,很糟糕的英语) – FelikZ

+0

任何帮助? – FelikZ

+0

嗨Felikz,对于迟到抱歉。 $ routeChangeError事件将为您提供以前的和尝试的路由对象作为参数。您可以从前一个路由对象获取前一个路由的路径,并使用'$ location.path()'将用户重定向到那里,并显示错误。 –