问题 AngularJS - 获取已定义路线的列表 - $ routeProvider


我正在努力实施 named routes,所以我不必写整个路径(经常更改)。

我以为我可以逃避编写一个服务,该服务将返回已定义路由的列表以及将对象转换为路径的过滤器

使用示例如下所示:

<a ng-href="{id:1}|route:'detail'">Click here!</a>

如果我在路由定义中添加了名称:'detail',则会产生以下结果:

<a href="#/detail/1/">Click here!</a>

我认为这很简单,但是:

如何获取已定义路线的列表?

我以为我可以利用 routeProvider ,但AFAIK它没有我可以访问的公共方法或属性。


10394
2018-04-15 09:53


起源

最后,实现某些东西的其他人缺乏角度。我喜欢Django。 - airtonix
@airtonix,您可以在下面查看我的解决方案 - g00fy
@airtronix有趣.. IMO棱角像豌豆和django就像玉米面包。有时豌豆和玉米面包在你吃它们时有点奇怪,但一个绝对不能替代另一个 - 即 github.com/balderdashy/sails-docs/blob/master/getting-started/... - mikermcneil


答案:


事实证明这很简单:

http://plunker.co/edit/GNZxcvK4hfQ9LrlSvasK?p=preview

Components.filter('url', function ($route) {
  function resolveRoute(options, route) {
    var parts = route.split('/');
    for (var i = 0; i < parts.length; i++) {
      var part = parts[i];
      if (part[0] === ':') {
        parts[i] = options[part.replace(':', '')];
        if (parts[i] == undefined) throw Error('Attribute \'' + part + '\' was not given for route \'' + route + '\'')
      }
    }
    return parts.join('/');
  }

  return function (options, routeName) {
    var routes = [];


    angular.forEach($route.routes,function (config,route) {
      if(config.name===routeName){
        routes.push(route);
      }
    });

    if (routes.length == 1) {
      return resolveRoute(options, routes[0]);
    }
    else if (routes.length == 0) {
      throw Error('Route ' + routeName + ' not found');
    }
    throw Error('Multiple routes matching ' + routeName + ' were found');
  }
});

12
2018-05-03 22:49



谢谢,我冒昧地把它打包成一个合适的角度模块: airtonix.github.io/angular-named-routes - airtonix
@ g00fy只是为了澄清 - $ route.routes包含所有路由的数组对吗?我没有测试过最新的角度,但似乎它在传统版本中不起作用(在v1.2.16中测试过)。这当然是有道理的,因为ngRoute被拉入一个单独的模块,但值得指出以防万一它可以帮助任何人。感谢你的回答! - mikermcneil