2014-02-19 145 views
18

我正在使用Angular ui-router,並且在初始化控制器之前爲我的狀態之一設置瞭解析函數。我檢索一些數據,循環並匹配它的URL stateParam,如果找到匹配,解析對控制器的承諾並返回承諾中的對象。這一切運作良好。

但是,如果沒有找到匹配我只是想通過拒絕承諾和運行$state.go('state');

只需將此重定向到一個不同的狀態:

deferred.reject(); 
$state.go('state',{params: 'param'}); 

但這似乎沒有不做任何事情。控制器掛起,我沒有控制檯錯誤或任何東西。有任何想法嗎?

+0

你能提供更多的代碼嗎?這是在'$ digest'循環中嗎? – rtcherry

+0

對不起,現在更清晰..這是在我的應用程序配置$ stateProvider,它是在我的狀態之一的決心。 –

回答

31

如果路由解析被拒絕,ui路由器應該拋出$stateChangeError。你需要注意這個事件,並在那裏觸發你的狀態轉換。

作爲每維基:

$stateChangeError - 當過渡期間發生錯誤燒製。重要的是要注意,如果你的解析函數(javascript錯誤,不存在的服務等)有任何錯誤,它們將不會拋出傳統。您必須監聽此$ stateChangeError事件才能捕獲所有錯誤。

https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events


正如在評論中提到@gustavohenke,把這種處理器的好地方是你的應用的主要.run()功能。

+0

謝謝。沒想過這個。 –

+1

我試着自己監聽$ stateChangeError事件,並且從來沒有看到它被觸發,即使當我知道$ q.reject被調用時也是如此。這使應用程序保持前一狀態,沒有通知,或者在第一次加載的情況下處於未知狀態。 – weierophinney

+1

您需要確保您正在處理已加載的控制器中的$ stateChangeError(例如層次結構高於您的解析調用)。如果您需要捕獲根狀態,請在您的html或body標籤上使用'ng-controller'作爲始終加載控制器的網站。 –

-3

您誤會了承諾的工作方式。 deferred.reject()只是通知deferred.promise它已被拒絕。

var promise = deferred.promise; 

promise.then(
    function (result) { 
    // this function runs if the promise was resolved 
    }, 
    function (result) { 
    // this function runs if the promise was rejected 
    // this is where you should put $state.go(..) 
    } 
) 
+1

他在問如何處理拒絕決心,他確切地知道什麼是承諾拒絕! – cheziHoyzer