Meteor的铁路由器 - 将多条路径路由到一个模板但仍然干燥

时间:2015-01-16 03:30:11

标签: meteor routing dry iron-router

我想将多个路径路由到同一个模板。例如,/abc/home/home都会显示home模板。路径也可以有子路径,因此abc/parent/child/parent/child也应该路由到同一路径。


  1. 我可以简单地重复

    Router.route('/home', function () {
      this.render('home');
      Session.set('menu', 'home');
    });
    Router.route('/abc/home', function () {
      this.render('home');
      Session.set('menu', 'home');
    });
    
  2. 但我不想重复。如果我想更改要路由到的模板,我想只更改一次 - 为了方便起见,并尽量减少错误。


    1. 我也可以使用参数

      Router.route('/:_abc/:path', function () {
        if(this.params._abc == 'abc') {
          switch(this.params.path) {
            case 'home':
              this.render('home');
              break;
            case 'someotherroute':
              this.render('someotherroute');
              break;
          }
        }
      });
      
    2. 但是,这又是在重复自己。此外,还有子路径,我不想为/:_abc/:parent/:children/:_abc/:grandparent/:parent/:children/:定义路由,因为它会很混乱。


      1. 我也尝试使用 Router.go()

        Router.route('/:_abc/:route', function () {
          if(this.params._abc == 'abc') {
            Router.go('/' + this.params.route);
          }
        });
        
      2. 但这会从网址中删除/abc/,这在我的情况下是不受欢迎的。


        1. 我现在拥有的最佳解决方案是使用共享功能

          var renderHome = function () {
            this.render('home');
            Session.set('menu', 'home');
          }
          
          Router.route('/home', renderHome());
          Router.route('/abc/home', renderHome());
          

        2. 我可以改为执行指定数组或逗号分隔的字符串

          Router.route(['/home', '/abc/home'], function () {
            this.render('home');
            Session.set('menu', 'home');
          });
          
          // or
          
          Router.route('/home, /abc/home', function () {
            this.render('home');
            Session.set('menu', 'home');
          });
          

          如何有效地将多条路径路由到一个模板,而不是重复自己?

2 个答案:

答案 0 :(得分:2)

使用与/home/abc/home匹配的正则表达式(正则表达式)。

答案 1 :(得分:0)

我制作了第二个模板,仅包含第一个模板。在您的情况下,这可能如下所示:

<template name="abcHome">
  {{> home}}
</template>