为保留URL时未登录的用户呈现不同的模板

时间:2014-05-01 21:30:49

标签: meteor iron-router

如果用户未登录,我想为他呈现SignIn模板,同时保留页面的URL。当他登录时,我想继续渲染他原来试图访问的URL。

以下一点CoffeeScript显示了我想要完成的目标。一个接近这个版本的版本直到最近一直工作,直到我更新到Meteor 0.8:

# If the user is not signed in, render the signin template instead of the
# actual page. However, keep the URL the same.

mustBeSignedIn = (pause) ->
    if not Meteor.user()?
        # How to render a different template from the intended one here?
        ### vvv ----
        @render('masterLayout'
            yieldTemplates:
                signIn:
                    to: 'content'
        )
        pause()

Router.onBeforeAction(mustBeSignedIn, {
    except: [ 'signIn' ]
})

我的layoutTemplate包含名为yield的{​​{1}}区域:

"content"

我直接转到<template name="masterLayout"> <div id="container-content"> {{> yield region="content"}} </div> </template> signingIn模板并正确呈现其他路径。

2 个答案:

答案 0 :(得分:1)

我认为你只需要返回渲染函数的结果。

mustBeSignedIn = (pause) ->
    if not Meteor.user()?

        return @render('masterLayout'
            yieldTemplates:
                signIn:
                    to: 'content'
        )

这也是优先考虑Meteor.userId()超过Meteor.user()的好习惯,因为userId()只有在userId发生变化时才会被激活,因为user()将导致onBeforeAction在任何时候发生变化时运行当前用户记录。

答案 1 :(得分:0)

yield中描述了this.render()到模板的正确语法:

  

您可以通过调用渲染功能手动渲染。有   调用render方法的三种方法:

     
      
  • {{> yield region='name'}}:渲染Route或RouteController的所有模板。这会将主模板渲染到主要的yield区域,并将所有yieldTemplates渲染到关联的this.render('templateName')区域。
  •   
  • {{> yield}}:将名为“templateName”的模板渲染为主要产量this.render('templateName', {to: 'region'})
  •   
  • {{> yield region='region'}}:将名为“templateName”的模板渲染到名为“region”{{1}}的区域。
  •   

第三点回答了有关如何将模板渲染到命名区域的问题。