已解决,但正在寻求改进,请参阅答案
function completedProfile() {
if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().university_id) {
return true;
} else {
return false;
}
}
Router.map(function() {
this.route('landing', {
path: '/', // match the root path
onBeforeAction: function() {
this.subscribe('users').wait();
if (this.ready() && completedProfile()) {
this.render('bulletin')
} else {
this.redirect('splash');
}
}
});
});
由于completeProfile函数为false(if语句中的所有字段均为空),页面将重定向到我的splash模板。
尝试2(填充字段后挂起):
Router.map(function() {
this.route('landing', {
path: '/', // match the root path
action: function() {
if (this.ready() && completedProfile()) {
this.redirect('bulletin')
} else {
this.render('splash');
}
},
});
尝试3:
function completedProfile() {
if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().profile.university_id) {
return true;
} else {
return false;
}
}
Router.map(function() {
this.route('landing', {
path: '/', // match the root path
action: function() {
console.log(Meteor.user().profile); //this fails
console.log(this.ready(), completedProfile()); //this then returns as expected
if (this.ready() && !completedProfile()) {
this.redirect('splash');
} else {
this.render('bulletin')
}
},
});
this.route('splash', {
path: '/splash', // match the root path
});
this.route('bulletin', {
path: '/bulletin', // match the root path
});
这很有道理。 Meteor.user的日志导致错误,然后 Meteor.user()加载给我一个适当的completedProfile()返回。错误是Exception in callback of async function: TypeError: Cannot read property 'profile' of undefined
。
答案 0 :(得分:2)
您似乎正在重定向到名为splash
的路线。你没有包含它,但我认为它存在。一旦您重定向,您就完成了landing
路由的任何逻辑,因此一旦用户登录就不会重新运行completedProfile()
。
请改为尝试:保持landing
路线,但render()
启动页面,直到用户登录。
if (this.ready() && completedProfile()) {
this.render('bulletin')
} else {
this.render('splash');
}
我认为this.subscribe('users').wait();
没有帮助。我会删除它。我想你也想使用action
而不是onBeforeAction
,因为你自己打电话给render()
。
另见:https://github.com/EventedMind/iron-router/issues/91。听起来像instant login这样可以很好地适用于您的用例。
答案 1 :(得分:1)
当前的工作解决方案:
function completedProfile() {
if (Meteor.user() && Meteor.user().profile.primary_email && Meteor.user().profile.display_name && Meteor.user().profile.university_id) {
return true;
} else {
return false;
}
}
Router.map(function() {
this.route('landing', {
path: '/', // match the root path
action: function() {
if (this.ready()) {
if (!completedProfile()) {
this.render('splash');
this.stop();
} else {
this.render('bulletin')
}
}
}
}
});