我有一个登录表单模板
<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");
});
答案 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将在模板呈现之前被调用,因此您不必担心分配的时间是否足够。