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']
Отказ от ответственности. Это всего лишь обходной путь, который я нашел и который работает для меня. Учитывая, что это поведение не документировано и что я не тестировал его, чтобы увидеть, работает ли он во всех сценариях, используйте его на свой страх и риск.