Meteor useccounts路由和路由优先级:如何确保静态路由首先被击中?

时间:2015-11-09 20:58:49

标签: meteor routing iron-router

我正在使用流星useraccounts和铁路由器,但我的猜测是这将适用于流路由器。

使用Meteor useraccounts,您可以通过以下代码配置/添加signIn,forgotPWD等路线:

AccountsTemplates.configureRoute('signIn', {
    name: 'signin',
    path: '/login',
    template: 'myLogin',
    layoutTemplate: 'myLayout',
    redirect: '/user-profile',
});

除了我还想允许根参数化路线之外,这一切都很好,花花公子:

Router.route '/:rootParam',
  name: 'rootParam'
  controller: share.WikiController
  onBeforeAction: ->
    rootParam = @params.rootParam
    if rootParam in share.staticRoutes
      Router.go(rootParam)  
    else
      @next()

因此,如果用户前往具有项目ID的路由,则可以使用,但如果他们转到静态useraccounts路由,例如/ login,那么也可以。

我发现它始终触及参数路径,静态路由永远不会起作用。

2 个答案:

答案 0 :(得分:1)

您无法在Router.go()中执行onBeforeAction。但是,您可以渲染路线。如果您的命名路由使用不同的布局,您可能还需要更改layoutTemplate

答案 1 :(得分:0)

我建议的一件事是,如果可以的话,不会超载路径的一部分,因为这可能会导致混淆哪条路线会被捕获。 /:itemid会抓住/login吗?如果您只看到/:itemid路线,那将是有意义的。

尝试使用/items/:itemid之类的内容,以便/login/items是静态且唯一的。

Router.route('/items/:itemid', function () {
    var item = Items.findOne({_id: this.params.itemid});
    this.render('ShowItem', {data: item});
});

如果您真的希望/路由到/items/:itemid,您仍然可以在路线功能中进行重定向。

Router.route('/', function () {
    //TODO: redirect to /items/:itemid
});