我有这些路线:
$routeProvider.when('/events/agenda',{...}); $routeProvider.when('/events/calendar',{...}); $routeProvider.when('/events/:id',{...});
只有当“:id”是一个数字时才应匹配“/ events /: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,search){ if (!+(routeParams.id)) // is :id a number? return '/events/agenda'; }
最终结果:
$routeProvider.when('/events/:id',$route) { return EventLoader({ id: $route.current.params.id }); } },redirectTo: function(routeParams,search){ if (!+(routeParams.id)) // is :id a number? return '/events/agenda'; });
解决方法
做返回路径;而在redirect中返回null则会修复问题,因为redirectTo应该返回一个它应该导航到的URL.