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

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

Ответы

Ответ 1

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

$route.current.regexp

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

$scope.isActive = function (path) {
    if ($route.current && $route.current.regexp) {
        return $route.current.regexp.test(path);
    }
    return false;
};

Ответ 2

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

  $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.

Ответ 3

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

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

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

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

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

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