看看我的控制器代码(coffeescript):
class @BasicController extends RouterController
layoutTemplate: "siteLayout"
onBeforeAction: (pause)->
unless Meteor.user()
@render("loginPage") #----------------->here
pause()
在这种情况下," loginPage"被渲染到yield
模板的siteLayout
区域。
但我需要它没有布局渲染。如何实现?
答案 0 :(得分:1)
告诉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
,铁路由器直接渲染到正文中。否则,使用siteLayout
。重要的部分是括号,尤其是导致函数被评估的最终()
,返回字符串或null
,而不是函数定义本身。
请注意,您可以为未登录的用户创建替代布局,例如,它具有最小的导航栏而不是完整的菜单,并将其放在第四行而不是null
。
答案 1 :(得分:1)
在https://github.com/EventedMind/iron-router/issues/600和https://github.com/EventedMind/iron-router/issues/607中对此进行了长时间的讨论。我已为此提交了一个补丁,您可以预期该行为会发生变化。
但是,您可以在渲染之前使用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
。
答案 2 :(得分:1)
您可以为每条路线指定默认模板layoutTemplate。
在这种情况下,我们只将 layoutTemplate 设置为null,仅用于登录模板。除登录模板外,其他路径将使用默认的layoutTemplate进行渲染。
Router.route('login', {
layoutTemplate: '' //set the layout template to null
});
答案 3 :(得分:0)
实际上非常简单:只需将 null
作为layoutTemplate
参数传递:
class @BasicController extends RouterController
layoutTemplate: null
onBeforeAction: (pause) ->
unless Meteor.user()
@render("loginPage")
pause()
击> <击> 撞击>