Angular UI-Router $ urlRouterProvider.when $ state忽略处理程序结果

时间:2014-10-03 02:26:48

标签: javascript angularjs rewrite angular-ui-router

我添加了when()方法来设置/验证路由前缀,如下所示:

$urlRouterProvider.when(/[a-z]{2}-[a-z]{2}/, [
  '$match','myValidatorSrv',
  function($match, myValidatorSrv) {
    if ( myValidatorSrv.validate($match[0]) ) return true;
    // …
    return $match.input.replace($match[0],'en-us');
  }
]);
$urlRouterProvider.when(/(?![a-z]{2}-[a-z]{2})/, [
  '$match','myValidatorSrv',
  function($match, myValidatorSrv) {
    // …
    return $match.input.replace('/', '/en-us/');
  }
]);

重写正如我所料,我得到/en-us/home(GET /home)。

我的州设置如下:

$stateProvider
.state('base', {
    abstract: true,
    url: '/{locale}'
})
.state('base.home', {
    url: '/home',
    views: {
        'home@': {
            templateUrl: '/partials/home.html'
        }
    }
});

问题是,在when()到位的情况下,状态不再匹配(视图不会被加载);即使我手动转到/en-us/home,状态仍然没有被触发。

我是否需要做一些特别的事情才能让$ state重新评估?

1 个答案:

答案 0 :(得分:2)

a working plunker

这将是经过调整的.when()

$urlRouterProvider.when(/[a-z]{2}-[a-z]{2}/,
  ['$match', function($match) {

    var supported = ['cs-cz', 'en-us', 'en-gb'];  
    var isSupported = supported.indexOf($match[0]) >= 0 ;
    if(isSupported){
      return false;
    }
    return $match.input.replace($match[0], 'en-us');
  }
]);
$urlRouterProvider.when(/^(.(?![a-z]{2}-[a-z]{2}))/,
  ['$match', function($match) 
  {
    return $match.input.replace('/', '/en-us/');
   }
]);

这一切都与:

有关

$urlRouterProvider - when() for redirection

小引用:

  

handler作为函数

     

如果处理程序是一个函数,它是可注入的。如果$ location匹配,则会调用它。您可以选择将匹配对象注入$ match

     

处理程序可以返回:

     
      
  • falsy 表示该规则毕竟不匹配,然后$ urlRouter将继续尝试找到另一个匹配的规则。
  •   
  • 字符串,被视为重定向并传递给$ location.url()
  •   
  • 没有或任何 truthy 值告诉$ urlRouter网址已被处理
  •   

检查here