AngularJs $ routeProvider:如果满足条件,使用redirectTo重定向

时间:2014-01-15 08:04:34

标签: angularjs route-provider

我有这些路线:

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

1 个答案:

答案 0 :(得分:7)

在redirectTo中代替return path;执行return null会解决问题,因为redirectTo应该返回一个应该导航到的网址。