如何根据某些表达式更改layoutTemplate?铁路由器

时间:2014-02-26 09:18:08

标签: meteor iron-router

我的应用有多种布局可满足不同需求,我想动态选择它。例如,取决于GET参数,或者如果用户登录。

我该怎么做?

4 个答案:

答案 0 :(得分:4)

您实际上可以使用前挂钩(以及可能的其他挂钩)中的this.router.layout()动态更改layoutTemplate。它有点隐藏,可能会改变但是我可以根据用户是否登录来更改layoutTemplate:

Router.configure({
    layoutTemplate: "defaultLayout",
    before: function (pause) {
        if(!Meteor.user()) {
            // render the login template but keep the url in the browser the same
            this.router.layout("loginLayout");
            this.render('login');

            // pause the rest of the before hooks and the action function
            pause();
        }else{
            //Here we have to change the layoutTemplate back to the default
            this.router.layout("defaultLayout");
        }
    }
});

如果您有多个layoutTemplates,这可能会有点复杂,因为一旦路径不再暂停,它将保留您设置的新layoutTemplate,除非您再次更改它。

答案 1 :(得分:3)

编辑由于作者在此编辑了这个问题,并且iron:router的规格也随着时间的推移发生了变化,我决定稍微更新一下这个答案,以防止混淆。

可以找到有关使用iron:router包的文档here

根据“参数”的类型,问题有几个可能的答案。

通常,主要知识来源是path,因为如果path保持不变,用户不一定希望更改页面布局。在这种情况下,事情非常简单,因为您唯一需要的是定义适当的路线:

Router.route('/some/path/', {
  layoutTemplate: 'myFirstLayoutTemplate'
});

Router.route('/another/path/', {
  layoutTemplate: 'mySecondLayoutTemplate'
});

如果您需要更精确的控制,您可以随时在分配给路线的action挂钩中手动选择布局:

Router.route('/some/path', {
  /* ... */
  action: function () {
    if (Meteor.user()) { // check if user is logged in
      this.layout('loggedInUserLayout');
    } else {
      this.layout('someDefaultLayout');
    }
    // you need this because otherwise the router
    // will not render your templates
    this.render();
  }
});

请注意,action挂钩是在computation内运行的,因为Meteor.user()是一个被动数据源,每次用户登录/登录时,您的页面都会被重新呈现-out。

有关布局的更多详细信息,请参见here

答案 2 :(得分:0)

Meteor目前无法在将服务器提供给客户端之前在服务器上动态呈现模板。相反,它将整个捆绑服务整合在一起。

因此,在该捆绑包中,您可以根据用户操作,URL路径,会话参数等创建模板并使用它们。

看看Iron Router,它会让你前进。

meteor-talk google小组上还有discussion正在进行meteor roadmap和{{3}} trello上的项目。

答案 3 :(得分:0)

我就把它留在这里,它是从2019年开始的,在遇到一些困难之后工作...

Router.route('/', function () {

    Router.current().layout("applicationLayoutEmpty");
    this.render('landing', {to: 'content'});

    if(Meteor.userId()){
        Router.go("/social");
    }

});

神奇之处在于: Router.current()。layout(“ applicationLayoutEmpty”);

在配置IronRouter时,它使用main.js中的默认设置,但是即使在浏览器窗口中也可以使用它-试试吧!