Javascript 有没有办法在iron router中呈现没有布局的模板?
只需查看我的控制器代码(coffeescript): 在这种情况下,“登录页面”被呈现到Javascript 有没有办法在iron router中呈现没有布局的模板?,javascript,meteor,meteorite,iron-router,Javascript,Meteor,Meteorite,Iron Router,只需查看我的控制器代码(coffeescript): 在这种情况下,“登录页面”被呈现到sitellayout模板的yield区域中。 但我需要不带布局的渲染。如何实现这一点?告诉Iron Router使用(或不使用)哪种布局的位置在layoutTemplate参数中,而不是在onBeforeAction函数中。诀窍是将layoutTemplate变成一个自动执行的匿名函数: class @BasicController extends RouteController layoutTempl
sitellayout
模板的yield
区域中。
但我需要不带布局的渲染。如何实现这一点?告诉Iron Router使用(或不使用)哪种布局的位置在
layoutTemplate
参数中,而不是在onBeforeAction
函数中。诀窍是将layoutTemplate
变成一个自动执行的匿名函数:
class @BasicController extends RouteController
layoutTemplate: (->
unless Meteor.user()
return null
else
return "siteLayout"
)()
onBeforeAction: (pause) ->
unless Meteor.user()
@render("loginPage")
pause()
在本例中,如果用户未登录,layoutTemplate
设置为null
,Iron Router直接渲染到主体中。否则,将使用站点布局
。重要的部分是括号,特别是最后的()
,它导致对函数求值并返回字符串或null
,而不是函数定义本身
请注意,您可以为未登录的用户创建一个替代布局,比如说它有一个最小的导航栏,而不是一个完整的菜单,并将它代替null
放在第四行。实际上非常简单:只需将null
作为layoutTemplate
参数传递即可:
class @BasicController extends RouterController
layoutTemplate: null
onBeforeAction: (pause) ->
unless Meteor.user()
@render("loginPage")
pause()
关于这一点,在和中进行了相当长的讨论;我已经为此提交了一个补丁,您可以预期行为会发生变化 但是,可以使用
this.setLayout
在渲染之前控制布局。在Iron Router 0.7.1中,您基本上需要以下内容:
class @BasicController extends RouteController
layoutTemplate: "siteLayout"
onBeforeAction: (pause) ->
unless Meteor.user()
@setLayout(null)
@render("loginPage")
pause()
@setLayout("siteLayout")
请注意,此处实际上忽略了
layoutTemplate
设置,但在合并上述拉取请求时,可以删除第二个setLayout
。可以为每个路由指定默认模板layoutTemplate
在本例中,我们仅将登录模板的layoutTemplate设置为null。除登录模板外,其他路由将使用默认layoutTemplate呈现
Router.route('login', {
layoutTemplate: '' //set the layout template to null
});
只需删除layoutTemplate定义即可。这将直接将模板呈现到正文中。@chaosbohne,谢谢您的评论。“SiteLayout”是整个站点的全局布局,不能删除。我只想在这种情况下(需要登录),在渲染“loginPage”时,不要使用布局,直接渲染到主体中。啊,我理解你的担心。也许使用Router.go重定向到另一个url可以帮助您?不幸的是,我不知道一个直接的方法。正如OP所指出的,他大部分时间都想使用
siteloayout
,而不是在用户未登录时。还要注意,它是RouteController
而不是RouterController
。它实际上是OP代码中的RouterController
。但你是对的,我误解了这个问题。谢谢。我只是说OP的代码有一个输入错误,应该是RouteController
。
Router.route('login', {
layoutTemplate: '' //set the layout template to null
});