Javascript 更新Meteor用户登录/注销时的条件属性

Javascript 更新Meteor用户登录/注销时的条件属性,javascript,html,templates,meteor,Javascript,Html,Templates,Meteor,我正在使用Meteor和Iron router(如果相关的话)。为了适应0.8更新,我做了一些更改,但仍有一些问题需要解决 我没有在html中的div中使用条件属性,而是使用.rendered来设置这些属性。但现在,当用户登录时,我必须刷新页面或来回导航(我认为没有必要刷新),以便元素正常运行 有人知道我如何在用户登录或注销时立即根据用户是登录还是注销使这些属性正常工作吗 Template.pt_entry.rendered = function() { $('#signin').popov

我正在使用Meteor和Iron router(如果相关的话)。为了适应0.8更新,我做了一些更改,但仍有一些问题需要解决

我没有在html中的div中使用条件属性,而是使用.rendered来设置这些属性。但现在,当用户登录时,我必须刷新页面或来回导航(我认为没有必要刷新),以便元素正常运行

有人知道我如何在用户登录或注销时立即根据用户是登录还是注销使这些属性正常工作吗

Template.pt_entry.rendered = function() {
  $('#signin').popover(),
  $('#reviewModal').on('shown.bs.modal', function () {
    $('#review-text').focus();
  });
  if(Meteor.userId()){
    $('#signin').attr( 'data-toggle', 'modal' ),
    $('#signin').attr( 'data-target', '#reviewModal' )
  } else {
    $('#signin').attr( 'data-toggle', 'popover' ),
    $('#signin').attr( 'data-container', 'body' ),
    $('#signin').attr( 'data-content', 'you must sign in to review' ),
    $('#signin').attr( 'data-trigger', 'click' )
    //add some logic for displaying error template.
  }
}

实际上你有不同的选择:

如果您使用的是iron router,则通常可以在同一路由中显示不同的模板。您可以检查用户是否已登录,并根据此检查可以在模板之间切换。您可以使用beforeHook进行检查:

beforeHooks =  {
  isLoggedIn: function() {
    if(!(Meteor.loggingIn() || Meteor.user())) {
      Router.go('landingPage');
      this.stop();
    }
  }
}

Router.onBeforeAction(beforeHooks.isLoggedIn);
另一个选项是使用默认的{currentUser}}帮助器

 {{#if currentUser}}
   <p>User is logged in</p>
 {{else}}
   <p>User is not logged in</p>
 {{/if}}
{{{#if currentUser}
用户已登录

{{else} 用户未登录

{{/if}

也许你的代码不起作用的原因可能是新的blaze引擎。渲染回调只触发一次。通常Meteor.userId()是一个反应式数据源,因此模板会被重新引用,但如果只是在更改未应用时触发渲染回调。也许这些思想能帮助你

谢谢。我想您已经掌握了第一种方法,但是我必须为登录和注销做类似的事情。基本上,它会将正在登录或注销的用户发送到他已经登录的页面。我会调查的。您列出的第二种方法看起来很简单,不需要动脑筋,应该可以工作,但我发现了一个错误。事实上,我用它来显示用户名和登录按钮。尽管如此,当我尝试以这种方式更改这些属性时,我会得到“意想不到的其他”。它一定与内容有关,但我不知道要编辑什么。好吧,我绕过了“意外的其他”错误。我试图通过在“之后启动“else”来避免重复“用户已登录”中的所有内容,但这显然不起作用。现在我唯一的问题是,如果不重新加载或来回导航,popover就无法工作。还在努力。你能更新你的例子吗?如果我能明白你的目的,也许我可以给你另一个暗示。你的第二个建议很有效。只是引导式弹出框非常棘手。这里的重点是显示一个弹出窗口,告诉用户在访问审阅表单之前必须登录。它在初始渲染时起作用,但在注销后不起作用。我的导航按钮位于与引导popover不同的模板中,我找不到一种方法来使用容纳它的模板之外的元素初始化popover。我尝试了一切(会话、依赖项、帮助程序)。最后,我只是将“location.reload();”设置为在单击注销按钮时运行。