检索给定userId的用户电子邮件

时间:2014-04-30 20:33:54

标签: meteor

这或多或少是this question的后续行动。

我正在尝试显示“朋友”,我有一个我发送请求的朋友列表(称为已发送):

{{#each sent}}
  <p>{{find_user _id}}</p>
{{/each}}

发送的内容如下:

Template.friends.sent = function () {
    return Notifications.find({from: Meteor.userId(),  // to, and from are now userIds and not the user like in the original question.
                               type: 'friendship'});
}

对计数的查询给出了七个。我的find_user模板定义如下:

Template.friends.find_user = function (id) {
    return Meteor.users.find({_id: id});
}

如何从用户ID中获取电子邮件?做类似的事情:

{{(find_user _id).emails.[0].address}}

失败,但是:

Expected IDENTIFIER.

1 个答案:

答案 0 :(得分:1)

首先看来,您正在迭代来自Notifications集合的游标,然后使用Notification记录的_id调用模板上的find_user方法。您需要使用文档的from字段,因为它是包含userId的字段。

接下来,您将至少要重写find_user方法,以便它不接受参数。您可以从帮助程序中访问相同的数据,因为this设置为当前数据上下文。

Template.friends.find_user = function () {
    return Meteor.users.find({_id: this.from}); //note the this.from
}

然后,只要您为当前用户发布该数据,您就可以通过模板帮助程序访问该电子邮件地址。

{{from_user.emails.0.address}}

就个人而言,我喜欢使用Meteor的集合转换来扩展我的模型,原型可以像模板助手那样使用。

//first we create our collection and add a transform option
Notifications = new Meteor.Collection("notifications", {
    transform: function(document){
        return new Notification(document);
    }
});

//next we create our constructor
Notification = function(document){
    _(this).extend(document);
};

//Then add some prototypal methods that we can use in our templates.
Notification.prototype = {
    fromUser: function(){
        return Meteor.users.findOne(this.from);
    }
};

现在我们可以在我们的模板中使用它:

{{fromUser.emails.0.address}}

我们还可以通过使用用户_transform属性来设置一个转换用户文档的函数,然后再向它们添加方法,从而使这一步更进一步。

//transform each user document into a new User instance
Meteor.users._transform = function(document){
    return new User(document);
};

//User constructor
User = function(document){
    _(this).extend(document);
};

//and finally the User prototype with methods
User.prototype = {
    defaultEmail: function(){
        return this.emails && this.emails[0].address;
    }
};

现在作为最终结果,您可以像这样使用它:

{{#each sent}
    <p>{{fromUser.defaultEmail}}</p>
{{/each}}