2014-01-15 3 views
5

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

$routeProvider.when('/events/agenda', {...}); 
$routeProvider.when('/events/calendar', {...}); 
$routeProvider.when('/events/: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 для проверки: значение «идентификатор». Если его количество, по-прежнему на вид и контроллер, иначе перенаправлять:

redirectTo: function(routeParams, path, search){ 
         if (!+(routeParams.id)) // is :id a number? 
          return '/events/agenda'; 

         return null; 
        } 

но возвращение нуль не отменяет переадресацию.

Я действительно не хочу ставить эту логику на контроллер, так как я считаю, что «соответствие URL-адресов» и проверка должны произойти перед тем, как перейти к контроллеру и представлению. Я правильно понимаю это, имеет ли смысл то, что я пытаюсь сделать?

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

UPDATE: Использовав отмеченное ответ, я вскоре понял, что была проблема с ним, если URL содержал поиска Params, а именно:? #/События/4450 присоединиться = истина

Использование «обратный путь ;» затем удалили параметры поиска. Это скорее должно быть:

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

Вы пробовали делать «обратный путь» вместо выполнения «return null» в функции redirectTo. – Chandermani

+0

@Chandermani .... argh, да, это работает ... Я не пробовал, потому что логика сказала мне, что я попаду в бесконечный цикл. Но угловая команда кажется немного умнее, и они справились с ней. Спасибо за помощь. –

+0

Добавьте его в качестве ответа, чтобы на вопрос можно было ответить. – Chandermani

ответ

7

Doing return path; вместо этого на return null в RedirectTo бы решить проблему, как RedirectTo должен возвращать URL он должен ориентироваться на.

Смежные вопросы