Meteor.User在初始加载时不会加载所有字段

时间:2015-02-12 05:14:04

标签: meteor iron-router

我在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');
},

1 个答案:

答案 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');
}