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

时间:2015-03-03 20:04:19

标签: meteor iron-router

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

假设我有URL列表

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

我有以下铁路由器配置:

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

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

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

如何从网址列表中获取路线名称列表?

2 个答案:

答案 0 :(得分:1)

那么,从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

但是,对于您的示例中具有'/clients/tJa84ogQ3cvpxMJ7G'等设置参数的网址,这不起作用,因为相应的路径不相同。在这里,它将是/clients/:clientId 你也许可以使用一些正则表达式的黑魔法并小心地分割URL,但它会变得复杂。

答案 1 :(得分:1)

我的回答:

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; }; 的代码

{{1}}