在Meteor中,使用铁路由器,我正在尝试实现路由映射,如果动态段与集合中的任何项不匹配,则该映射具有动态段和后备路由。例如,假设我有一个像这样的URL:
我想首先检查harold
是否与Posts
集合中的任何ID匹配。如果有匹配则应该转到postPage
模板。
如果没有匹配项,那么路由器应该呈现harold
匹配任何项目。
我搜索了所有铁路由器文档,但似乎无法找出正确的方法。我想知道是否有类似this.next()
的内容取消了当前的路由映射并转到下一个路由映射。这是我尝试这样做的尝试:
Router.map(function () {
this.route('postPage', {
// matches: '/MFLS6aKqqRZ2JGz9q'
// matches: '/81zBqGE85aAfjk1js'
path: '/:postId',
before: function () {
//check if segment matches a post ID
post = Posts.findOne(this.params.postId);
if (!post) {
//If no matches, then go to next route
//Something like this.next()?
}
},
data: function() {
return Posts.findOne(this.params.postId);
}
});
this.route('profilePage', {
// matches: '/harold'
// matches: '/brendan'
path: '/:username',
data: function() {
return Profiles.findOne(this.params.username);
}
});
});
答案 0 :(得分:0)
你所描述的只是一条路线:/:input
其中input
可以是任何东西。正如@David Weldon所说,这不是一个好主意;它基本上颠覆了使用路由器的重要性,并且每次URL更改时都会运行大量额外的代码和数据库查询。
那就是说,如果你真的想这样做,你只需将所有代码折叠成一条路线:
Router.map(function () {
this.route('theOneRouteToRuleThemAll', {
path: '/:input',
data: function() {
if (Profiles.findOne({username: this.params.input}) != null)
return Profiles.findOne({username: this.params.input});
else if (Posts.findOne({postId: this.params.input} != null)
return Posts.findOne({postId: this.params.input};
else
return null; // No user or post found; could handle with notFoundTemplate
}
});
});