Meteor如何将渲染模板延迟3秒

时间:2015-07-02 17:31:20

标签: javascript meteor meteor-blaze meteor-accounts

我有一个登录表单模板

<template name="loginPage">...content</template>

并在未登录{{currentUser}}时呈现。 问题是页面刷新后currentUser大约一秒钟不可用,即使用户已登录。这会导致登录页面出现一秒钟,即使用户已经登录,这也不会看起来不错。知道如何延迟渲染登录页面,以确保是否真的登录{{currentUser}}

[解决]

HTML

{{#if loggingIn}}
  please wait, user is logging in
{{/if}}
{{#unless loggingIn}}
  {{#if currentUser}}
    user logged in
  {{/if}}
  {{#unless currentUser}}
    login form
  {{/unless}}
{{/unless}}

JS

// create global {{#if loggingIn}}{{/if}} helper
Session.set("loggingIn", true);
var loginWait = 3; // seconds
var loginTimeout = setInterval(function(){
  loginWait = loginWait - 1;
  if(loginWait <= 0 || Meteor.user()){
    Session.set("loggingIn", false);
    clearInterval(loginTimeout);
  }
},1000);
Handlebars.registerHelper('loggingIn', function () {
  return Session.get("loggingIn");
});

2 个答案:

答案 0 :(得分:2)

在模板中,您可以执行以下操作:

{{#if loggingIn}}
  HTML to be rendered before the user is determined
{{else}}
  {{#if currentUser}}  
    Html to be rendered if the user is logged in 
  {{else}}  
    Html to be rendered if the user is not logged in
  {{/if}}
{{/if}}
顺便说一句,我确实意识到这并没有提供你所要求的答案,但我认为这可能是一种更好的方法。

答案 1 :(得分:0)

进行用户登录检查的正确位置在JS的onRendered方法中。

Template.loginPage.onRendered(function () {
  if(! Meteor.user()) {
    //route somewhere else
  }
});

您无需为加载添加不确定的时间,onRendered将在模板呈现之前被调用,因此您不必担心分配的时间是否足够。