我有这些路线:
$routeProvider.when('/events/agenda', {...});
$routeProvider.when('/events/calendar', {...});
$routeProvider.when('/events/:id', {...});
只有当“:id”是一个数字时,“/events/:id”路由才应该匹配......目前,像“/events/whateverilike”这样的url被该路由匹配。
所以我想要做的是将我的路线定义为正常:
$routeProvider.when('/events/:id', { templateUrl: 'views/events/event-profile.html', controller: 'EventProfileCtrl',
resolve: {
event: function (EventLoader, $route) {
return EventLoader({ id: $route.current.params.id });
}
});
但我想利用redirectTo 来验证“:id”值。如果它是一个数字,继续查看和控制器,否则重定向:
redirectTo: function(routeParams, path, search){
if (!+(routeParams.id)) // is :id a number?
return '/events/agenda';
return null;
}
但返回 null 不会否定重定向。
我真的不想把这个逻辑放在控制器上,因为我相信“url-matching”和验证应该在进入控制器和查看之前发生。我是否正确理解这一点,我正在尝试做的事情是否有意义?
任何帮助和建议将不胜感激。
更新: 使用标记的答案后,我很快意识到如果 url 包含搜索参数,它就会出现问题,即:#/events/4450?join=true
使用“返回路径;” 然后删除了搜索参数。这应该是:
redirectTo: function(routeParams, path, search){
if (!+(routeParams.id)) // is :id a number?
return '/events/agenda';
}
最终结果:
$routeProvider.when('/events/:id', { templateUrl: 'views/events/event-profile.html', controller: 'EventProfileCtrl',
resolve: {
event: function (EventLoader, $route) {
return EventLoader({ id: $route.current.params.id });
}
},
redirectTo: function(routeParams, path, search){
if (!+(routeParams.id)) // is :id a number?
return '/events/agenda';
});