我添加了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重新评估?
答案 0 :(得分:2)
这将是经过调整的.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/');
}
]);
这一切都与:
有关when()
for redirection 小引用:
handler
作为函数如果处理程序是一个函数,它是可注入的。如果$ location匹配,则会调用它。您可以选择将匹配对象注入$ match
处理程序可以返回:
- falsy 表示该规则毕竟不匹配,然后$ urlRouter将继续尝试找到另一个匹配的规则。
- 字符串,被视为重定向并传递给$ location.url()
- 没有或任何 truthy 值告诉$ urlRouter网址已被处理
检查here