Angular js - 检查当前url是否与路由匹配(使用动态url参数)

时间:2014-03-02 13:45:49

标签: javascript angularjs match ngroute

我只是在设置这个:

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

例如网址:asd/5/it-is-a-slug

这是最简单的方法吗?

我试过这个:

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

但有时在切换页面路径时它在控制台中什么都不返回

3 个答案:

答案 0 :(得分:25)

当前路线允许您使用正则表达式。注入$route服务并浏览当前路由对象。即regexp部分:

$route.current.regexp

这是你如何使用它(例如从控制器方法检查当前菜单项(具有动态部分)是否应该被激活):

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

答案 1 :(得分:1)

您可以尝试这样的事情:

  $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

答案 2 :(得分:0)

不是一个非常优雅的解决方案,我只在Chrome DevTools中进行了测试,但似乎有效:

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

似乎$ routes服务的routes属性是一个对象文字,其键设置为每个路由的模式。

对于想要使用此功能的其他人,只需将'/asd/:id/:slug'替换为您在定义路线时使用的模式。

此外,如果您想匹配otherwise路径,请使用$route.routes['null']

免责声明:这只是我找到的解决方法,对我有用。鉴于此行为未记录,并且我没有对其进行测试以确定它是否适用于所有方案,因此使用它需要您自担风险。