我的应用有多种布局可满足不同需求,我想动态选择它。例如,取决于GET参数,或者如果用户登录。
我该怎么做?
答案 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中的默认设置,但是即使在浏览器窗口中也可以使用它-试试吧!