根据用户是否登录 Meteor 设置不同的路由
Setting different routes dependent on if user logged in Meteor
我正在努力为账户持有人和客人设置不同的主路线模板。我似乎无法根据用户是否登录来呈现不同的模板(两个不同的导航栏)。我已经为客人设置了模板
//guest.js
<template name="unregistered">
{{>navUnreg}}
<div class="container">
{{>about}}
</div>
</template>
<template name="navUnreg">
<nav class="navbar navbar-default">
<div class="container">
<ul class="nav navbar-nav">
<a class="navbar-brand" href="#">CabStack</a>
</ul>
<ul class="nav navbar-nav navbar-right">
{{>loginButtons}}
</ul>
</div>
</nav>
</template>
这是未登录用户的通用关于页面。然后我有已登录帐户用户的模板是 -
//UserLoggedIn.js
<template name="cabMaster">
{{>cabNav}}
<div class="container">
{{>yield}}
</div>
</template>
我最初尝试将 if/else 语句放入路由器配置中 -
//config.js
Router.configure({
if(Meteor.user()){
layoutTemplate: "cabMaster"
}
else{
layoutTemplate: "unregistered"
}
});
但是,我一直收到错误消息。我已经在 userLoggedIn.js 页面上使用 Router.onBeforeAction 来限制对路由的访问,直到填写了个人资料页面
//Access rights for logged in users
function userNoAccess(){
if(!Meteor.userId()){
alert("restricted until profile page completed");
this.render(“profile”);
return pause();
} else {
this.next();
}
}
//Do not allow access to nav links until user has filled out ‘profile’ page.
Router.onBeforeAction(userNoAccess, {
only: ["dashboard", "edit_dashboard", "help"]
});
所以
我确实考虑过将 userLoggedIn 路由放在我的 client.js 文件中的 Accounts.onLogin() 函数中,但我想将所有路由放在一个地方。有没有人对我如何实现这一目标有任何建议。谢谢
有几种方法可以解决这个问题。例如,您不必在路由器中执行所有操作。导航栏的选择可以直接在您的模板中进行:
<template name="navBar">
{{#if currentUser}}
{{> navReg}}
{{else}}
{{> navUnreg}}
{{/if}}
</template>
当您尝试更改布局的小部分而不切换整个布局时,这非常方便。
我建议您考虑使用 控制器 来处理经过身份验证和未经身份验证的路由。它们使您的路由代码更易于维护。我写了一个 basic tutorial 可能对你有帮助。
我正在努力为账户持有人和客人设置不同的主路线模板。我似乎无法根据用户是否登录来呈现不同的模板(两个不同的导航栏)。我已经为客人设置了模板
//guest.js
<template name="unregistered">
{{>navUnreg}}
<div class="container">
{{>about}}
</div>
</template>
<template name="navUnreg">
<nav class="navbar navbar-default">
<div class="container">
<ul class="nav navbar-nav">
<a class="navbar-brand" href="#">CabStack</a>
</ul>
<ul class="nav navbar-nav navbar-right">
{{>loginButtons}}
</ul>
</div>
</nav>
</template>
这是未登录用户的通用关于页面。然后我有已登录帐户用户的模板是 -
//UserLoggedIn.js
<template name="cabMaster">
{{>cabNav}}
<div class="container">
{{>yield}}
</div>
</template>
我最初尝试将 if/else 语句放入路由器配置中 -
//config.js
Router.configure({
if(Meteor.user()){
layoutTemplate: "cabMaster"
}
else{
layoutTemplate: "unregistered"
}
});
但是,我一直收到错误消息。我已经在 userLoggedIn.js 页面上使用 Router.onBeforeAction 来限制对路由的访问,直到填写了个人资料页面
//Access rights for logged in users
function userNoAccess(){
if(!Meteor.userId()){
alert("restricted until profile page completed");
this.render(“profile”);
return pause();
} else {
this.next();
}
}
//Do not allow access to nav links until user has filled out ‘profile’ page.
Router.onBeforeAction(userNoAccess, {
only: ["dashboard", "edit_dashboard", "help"]
});
所以
我确实考虑过将 userLoggedIn 路由放在我的 client.js 文件中的 Accounts.onLogin() 函数中,但我想将所有路由放在一个地方。有没有人对我如何实现这一目标有任何建议。谢谢
有几种方法可以解决这个问题。例如,您不必在路由器中执行所有操作。导航栏的选择可以直接在您的模板中进行:
<template name="navBar">
{{#if currentUser}}
{{> navReg}}
{{else}}
{{> navUnreg}}
{{/if}}
</template>
当您尝试更改布局的小部分而不切换整个布局时,这非常方便。
我建议您考虑使用 控制器 来处理经过身份验证和未经身份验证的路由。它们使您的路由代码更易于维护。我写了一个 basic tutorial 可能对你有帮助。