2014-08-28 392 views
1

的角度UI-路由器文檔使用下面的示例重定向:角UI-路由器重定向路由

$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) { 
    if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) { 
     $state.transitionTo(state, $match, false); 
    } 
}]); 

https://github.com/angular-ui/ui-router/wiki/URL-Routing#when-for-redirection

我的問題是關於state.url。您可以使用$state服務獲取州的網址,例如$state.get('home')

但是這是一個服務,並沒有在配置階段可用,所以我將如何去獲取一個狀態的URL,把它作爲$urlRouterProvider.when的第一個參數?

回答

0

$routeProvider是墊片的實現了當前AngularJS上的$stateProvider頂部$route/$routeProvider API,使人們更容易一步過渡應用$ stateProvider一步 - 它只是通過編造囈語路線定義爲一個狀態定義一個名字和其他一些小東西。

$urlRouterProvider只是有責任看$location,並且當它逐一改變運行規則列表直到一個匹配。如何定義「匹配」以及規則匹配時發生的情況取決於該規則;在最低級別,它只是一個函數,如果它處理了URL,則返回true。然而,對於RegExps的規則以及帶有佔位符(由state.url使用)的路徑模式(通過$urlMatcherFactory編譯爲規則),在此基礎上構建了支持。 $urlRouterProvider也支持重定向。

因爲它的立場$urlRouterProvider應該已經比$routeProvider相應的代碼更快,因爲它不會重新解析在每個位置更改URL模式,而是掛到編譯UrlMatcher對象。

+0

太好了,謝謝你的提供。所以,爲了處理重定向,你會推薦使用創建一個自定義的正則表達式匹配器(並將其與狀態url相對應)? – TaylorMac 2014-08-28 16:47:55

+0

是的。創建你自己的自定義正則表達式匹配器應該可以解決這個問題 – 2014-08-28 16:49:29

+0

沒問題,這看起來有點多餘,但如果沒有其他解決方案,那麼這將起作用。 – TaylorMac 2014-08-28 17:12:16

0

這實際工作更好,因爲你沒有創建一個正則表達式:

var forks = { 
    issueConditionFork: function() { 
    if ($stateParams.serviceType === 'sell') { 
     return 'condition'; 
    } 
    } 
}; 

$rootScope.$on('$stateChangeStart', function(event, state) { 
    var fork; 
    fork = forks[state.name]; 
    if (fork) { 
    $state.go(fork()); 
    return event.preventDefault(); 
    } 
}); 

運行中的塊。