Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法在iron router中呈现没有布局的模板?_Javascript_Meteor_Meteorite_Iron Router - Fatal编程技术网

Javascript 有没有办法在iron router中呈现没有布局的模板?

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

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

在这种情况下,“登录页面”被呈现到
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
    });