2015-02-09 84 views
2

我正在使用ui路由器。
我希望能夠阻止任何狀態轉換,直到承諾解決。

有多種狀態,所以設置相同的resolve屬性並不是一個好主意。

承諾需要在Angular應用程序內部解決,因此在解決外部承諾後引導應用程序將無法工作。

我當前的解決方案依賴於有一個$stateChangeStart偵聽器,該偵聽器調用event.preventDefault();,並在解析諾言後自行刪除。這個解決方案有許多複雜的情況,除非它的意圖不明確,除非得到很好的評論。

那麼,有沒有更好的解決方案來阻止所有的狀態轉換,直到一切都很酷?

+0

它一般不會去阻止用戶界面是一個好主意。無論如何,如果你試圖強制應用程序同步,爲什麼要使用承諾呢? – Claies 2015-02-10 01:11:54

+0

這是一個嚴重的依賴關係,沒有它應用程序無法運行。而且它不會阻塞用戶界面,本身,線程是免費的。 – Francisc 2015-02-10 09:28:10

回答

2

我想你想使用$urlRouterProvider.deferIntercept()

在這裏看到:http://angular-ui.github.io/ui-router/site/#/api/ui.router.router $ urlRouterProvider

app.config(function ($urlRouterProvider) { 
    $urlRouterProvider.deferIntercept(); 
}; 

app.run(function($urlRouter, myservice) { 
    myservice.promise.then(function() { 
    $urlRouter.listen(); 
    $urlRouter.sync(); // not sure if this is necessary 
    }); 
}); 
+0

這很完美,謝謝克里斯。 – Francisc 2015-02-11 09:45:29

3

創建一個抽象的父狀態,使該狀態的其他孩子。在父狀態上使用解析對象,因此它的結果依賴關係將可用於所有子狀態。

參見:https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#abstract-states

一種抽象狀態可以有子狀態,但不能得到激活本身。 「抽象」狀態只是一個無法轉換到的狀態。當其後代的一個被激活時,它被隱式激活。

的如何使用抽象的狀態是一些例子:

  • 要通過解決供兒童國家提供解析的依賴。
+0

我想到了這一點,這不是一個壞主意,但我不得不將所有狀態和應用程序中的所有相對路徑都改爲兒童或相對於這個新的抽象路線。 ui-router有一個名爲'「」'的父級霸主抽象狀態,但我似乎無法訪問它,因此無法爲其添加解析。 – Francisc 2015-02-10 09:29:31

+1

我知道,這涉及到工作,您要求提供最佳/最乾淨的解決方案,而且在我看來。沒有必要改變你的路由ui-sref's,state.go()的等等,只要你不使用像parentName.childName這樣的父/子狀態就可以保持子節點的名字相同並且聲明這個孩子的stateobject中的父類像:''parent':'parentName'',這樣'$ state.go('childName')'和'ui-sref =「childName」'仍然可以工作。從來沒有注意到,你提到的霸主狀態對於具有某種全局解析功能是很酷的。太糟糕了,它不會工作。 – iH8 2015-02-10 11:33:34

+0

感謝您的回答,我很感激。對我來說,除了使用調用'event.preventDefault()'的'$ stateChangeStart'攔截器之外,更多的工作是直到所有的promise都被解析。我希望這樣做完全沒有人爲的方式。爲應該很簡單的事情創建一個狀態似乎是人爲的。 – Francisc 2015-02-10 12:41:02