有没有办法在铁路由器中渲染没有布局的模板?

时间:2014-04-11 23:37:39

标签: javascript meteor meteorite iron-router

看看我的控制器代码(coffeescript):

class @BasicController extends RouterController
  layoutTemplate: "siteLayout"
  onBeforeAction: (pause)->
    unless Meteor.user()
      @render("loginPage")   #----------------->here
      pause()

在这种情况下," loginPage"被渲染到yield模板的siteLayout区域。 但我需要它没有布局渲染。如何实现?

4 个答案:

答案 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/600https://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()

<击>