Iron Router中具有默认路由的动态段?

时间:2014-03-23 07:51:21

标签: javascript meteor iron-router

在Meteor中,使用铁路由器,我正在尝试实现路由映射,如果动态段与集合中的任何项不匹配,则该映射具有动态段和后备路由。例如,假设我有一个像这样的URL:

http://foobar.com/harold

我想首先检查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);
    }
  });
});

1 个答案:

答案 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
    }
  });
});