5

我有这些路线:

$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';
    });
4

1 回答 1

7

在redirectTo中return path;改为 onreturn null可以解决问题,因为 redirectTo 应该返回它应该导航到的 url。

于 2014-01-15T09:03:43.280 回答