2014-08-28 175 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(); 
    } 
}); 

运行中的块。