如何使用 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');
但是,这不适用于设置了参数的 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;
};
我知道要获取当前路线的名称,我需要使用 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');
但是,这不适用于设置了参数的 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;
};