Angular js - проверьте, соответствует ли текущий URL-адрес маршруту (с параметрами динамического URL-адреса)

я просто устанавливаю это:

app.config(['$routeProvider',function($routeProvider) {
  $routeProvider
  .when('/asd/:id/:slug',{
    templateUrl:'views/home/index.html',
    controller:'Home',
    publicAccess:true,
    sessionAccess:true
  });

:id и :slug являются динамическими параметрами.

Теперь я хотел бы check if current url matches пройти этот маршрут (/asd/:id/:slug)

например URL: asd/5/it-is-a-slug

какой самый простой способ?

я пробовал это:

$rootScope.$on('$routeChangeStart', function(){ 
   console.log($route.current); 
});

но иногда он ничего не возвращает в консоли при переключении маршрутов страниц


person itsme    schedule 02.03.2014    source источник
comment
Вы можете внедрить службу $route в свой контроллер и проверить $route.current, чтобы получить текущий маршрут. Не нужно сопоставлять URL-адрес.   -  person Khanh TO    schedule 02.03.2014
comment
Вы имеете в виду контроллер Home, потому что на него можно сопоставить несколько маршрутов? Как сказал @KhanhTO, введите $route и проверьте $route.current.params или что-то еще. Хотя я думаю, что ваш код должен больше заботиться о том, есть ли у вас параметры, чем о том, совпадает ли URL-адрес. Если совершенно разные URL-адреса с разными значениями попадают на один и тот же контроллер, вам, вероятно, следует использовать другой контроллер.   -  person Emerson Farrugia    schedule 02.03.2014
comment
@EmersonFarrugia я на самом деле не могу понять, почему он не работает должным образом на каждом routeChangeStart иногда кажется, что $ route.current недоступен   -  person itsme    schedule 02.03.2014


Ответы (3)


Текущий маршрут позволяет использовать регулярное выражение. Внедрите сервис $route и исследуйте текущий объект маршрута. А именно regexp часть:

$route.current.regexp

Вот как вы можете его использовать (пример из метода контроллера, чтобы проверить, должен ли текущий пункт меню (который имеет динамические части) быть активирован):

$scope.isActive = function (path) {
    if ($route.current && $route.current.regexp) {
        return $route.current.regexp.test(path);
    }
    return false;
};
person dfsq    schedule 02.03.2014
comment
почему при загрузке первой страницы $route.current кажется недоступным? при первом просмотре страницы он появляется, а затем доступен - person itsme; 02.03.2014
comment
Я думаю, это связано с тем, как работает цикл дайджеста. Ему нужно оценить выражение наблюдения как минимум дважды, чтобы узнать, что оно изменилось. - person dfsq; 02.03.2014

Вы можете попробовать что-то вроде этого:

  $routeProvider.when('/asd/:id/:slug', {
    templateUrl: '/views/template.html',
    controller: 'YourController',
    resolve: {
      data: ['$route', 'SecurityFactory',
        function ($route, SecurityFactory) {

          var id= parseInt($route.current.params.id, 10);
          var slug= $route.current.params.slug;

          SecurityFactory.checkParams(id, slug);
        }
      ]
    }
  });

Затем внутри SecurityFactory вы можете проверить правильность параметров. Например, с помощью RegExp.

person Tome Pejoski    schedule 02.03.2014
comment
почему при загрузке первой страницы $route.current кажется недоступным? при первом просмотре страницы он появляется, а затем доступен - person itsme; 02.03.2014

Не очень элегантное решение, и я тестировал его только в Chrome DevTools, но, похоже, оно работает:

Object.getPrototypeOf($route.current) === $route.routes['/asd/:id/:slug'];

Кажется, что свойство route службы $routes является литералом объекта с ключами, установленными для шаблонов для каждого маршрута.

Для других, желающих использовать это, просто замените '/asd/:id/:slug' шаблоном, который вы использовали при определении своего маршрута.

Также, если вы хотите сопоставить путь otherwise, просто используйте $route.routes['null']

Отказ от ответственности: это просто обходной путь, который я нашел и который работает для меня. Учитывая, что это поведение не задокументировано и я не тестировал его, чтобы увидеть, работает ли оно во всех сценариях, используйте его на свой страх и риск.

person Tiborg    schedule 29.07.2015