我在Meteor.Users集合中添加了一个名为usertype的附加字段。在Iron-router中,如果用户登录,我将返回用户对象。现在在我的模板中,我需要检查是否存在此usertype字段,我将用户引导到用户注册屏幕。
这里发生的事情是,即使我的发布函数中有usertype字段,最初也不会返回此字段的用户对象。它仅在2-3个对象加载后显示。这会混淆模板加载逻辑,因为在初始加载时找不到此字段,但实际上该字段存在时。
DashboardController = RouteController.extend({
template: 'dashboard',
subscriptions: function() {
this.userProfileSub = Meteor.subscribe('singleUser', this.myId());
},
myId: function() {
var userId = Meteor.userId();
if(!userId)
{ userId = ''; }
return userId;
},
user: function() {
return Meteor.users.findOne(this.myId());
},
data: function() {
var user = this.user();
console.log(user);
if(user)
{
return {
user: this.user(),
ready: this.userProfileSub,
};
}
}
});
这是发布方法:
Meteor.publish('singleUser', function(id) {
check(id, String);
return Meteor.users.find({_id:id}, {fields: { emails: 1,
profile: 1,
usertype: 1,
"services.facebook.id": 1,
"services.facebook.email": 1,
"services.twitter.screenName": 1,
"services.twitter.profile_image_url": 1,
"services.google.email": 1,
"services.google.picture": 1}});
});
修改 如下面给出的答案,如果订阅在waitOn块内移动,它应该等待订阅完全加载。
waitOn: function() {
this.userProfileSub = Meteor.subscribe('singleUser', this.myId());
return [this.userProfileSub];
},
但是现在当我尝试等待多个订阅加载到wait数组中时,它显然没有等待所有这些订阅。我仍然得到空阵列。即使我检查了动作块。我可以稍后从我的控制台找到数据。
waitOn: function() {
return [
Meteor.subscribe('singleUser', this.myId()),
Meteor.subscribe('singleAgentByUserId', this.myId()),
Meteor.subscribe('singleClientByUserId', this.myId())];
},
action: function () {
// this.ready() is true if all items returned from waitOn are ready
if (this.ready())
{
this.render();
}
else
this.render('Loading');
},
答案 0 :(得分:0)
更新已编辑(由于原始问题,请参阅修订历史记录以获取更多不同版本)
尝试:
waitOn: function() {
return [
Meteor.subscribe('singleUser', Meteor.userId()),
Meteor.subscribe('singleAgentByUserId', Meteor.userId()),
Meteor.subscribe('singleClientByUserId', Meteor.userId()];
},
loadingTemplate: "loading",
action: function () {
this.render('dashboard');
}