AngularJs $routeProvider: использование redirectTo для перенаправления при выполнении условия

У меня есть эти маршруты:

$routeProvider.when('/events/agenda', {...});
$routeProvider.when('/events/calendar', {...});
$routeProvider.when('/events/:id', {...});

Маршрут "/events/:id" должен сопоставляться только в том случае, если ":id" является числом... В настоящее время URL-адреса типа "/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» и проверка должны выполняться до перехода к контроллеру и просмотру. Правильно ли я понимаю, имеет ли смысл то, что я пытаюсь сделать?

Любая помощь и предложения будут высоко оценены.

ОБНОВЛЕНИЕ: Воспользовавшись отмеченным ответом, я вскоре понял, что с ним возникла проблема, если 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';
    });

person Gavin van Gent    schedule 15.01.2014    source источник
comment
Вы пытались сделать return path вместо return null в функции redirectTo.   -  person Chandermani    schedule 15.01.2014
comment
@Changermani .... ааа, да, это работает ... Я не пробовал, потому что логика подсказывала мне, что я попаду в бесконечный цикл. Но команда angular кажется немного умнее, и они справились с этим. Спасибо за помощь   -  person Gavin van Gent    schedule 15.01.2014
comment
Добавление его в качестве ответа, чтобы вопрос можно было пометить как ответ.   -  person Chandermani    schedule 15.01.2014


Ответы (1)


Выполнение return path; вместо return null в redirectTo устранит проблему, поскольку redirectTo должен возвращать URL-адрес, на который он должен перейти.

person Chandermani    schedule 15.01.2014