我有这些路线:
$routeProvider.when('/events/agenda', {...});
$routeProvider.when('/events/calendar', {...});
$routeProvider.when('/events/:id', {...});
“/ events /:id”路由只有在“:id”是数字时才匹配...目前,“/ events / whateverilike”等网址与该路由匹配。
所以我想要做的就是正常定义我的路线:
$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”和验证应该在进入控制器和查看之前发生。我是否正确地理解了这一点,我正在尝试做什么才有意义?
非常感谢任何帮助和建议。
更新 使用了标记的答案后,我很快意识到如果网址包含搜索参数,则存在问题,即:#/ 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';
});
答案 0 :(得分:7)
在redirectTo中代替return path;
执行return null
会解决问题,因为redirectTo应该返回一个应该导航到的网址。