如何使用 Iron Router 在 Meteor 中通过 URL 获取路由名称

How to get route name by URL in Meteor using Iron Router

我知道要获取当前路线的名称,我需要使用 do Router.current().route.getName()。如果我需要通过给定的 URL(不是当前的 URL)获取路线名称怎么办?

假设我有 URLS

的列表
urls = ['/orders', '/clients', '/clients/tJa84ogQ3cvpxMJ7G']

我有以下 Iron Router 配置:

Router.route('/orders', {name: 'ordersList'});

Router.route('/clients', {name: 'clientsList'});

Router.route('/clients/:_id', {
  name: 'clientPage',
  data: function() {
    return Clients.findOne(this.params._id);
  }
});

如何从 urls 列表中获取路由名称列表?

那么,从 URL 列表中获取所有匹配路由的列表?

var urls = ['/path1', '/path2/subpath', ...];
var matchingRoutes = _.filter(Router.routes, function(route) {
  return _.contain(urls, route.path);
});

如果您想要具体的路线名称:

var matchingRoutesNames = _.pluck(matchingRoutes, 'name');

More about underscore

但是,这不适用于设置了参数的 URL,例如您的示例中的 '/clients/tJa84ogQ3cvpxMJ7G',因为相应的路径不同。在这里,它将是 /clients/:clientId.
您也许可以使用一些 Regex 黑魔法并仔细拆分 URL,但它会变得复杂。

我的回答:

var urls = ['/orders', '/clients', '/clients/tJa84ogQ3cvpxMJ7G'];

routeNames = _.map(urls, function(url) {
  var route = Router.findFirstRoute(url);
  return route ? "", route.getName();
});

代码来自 ironrouter/router-client.js:151

Router.prototype.findFirstRoute = function (url) {
  var isMatch;
  var routeHandler;
  for (var i = 0; i < this.routes.length; i++) {
    route = this.routes[i];

    // only matches if the url matches AND the
    // current environment matches.
    isMatch = route.handler.test(url, {
      where: Meteor.isServer ? 'server' : 'client'
    });

    if (isMatch)
      return route;
  }

  return null;
};