2013-05-18 20 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()'將用戶重定向到那裏,並顯示錯誤。 –