我试图发布一个发布声明
只有作者(OP)的个人资料头像。我想抓住页面的_id
。在该页面中,我将抓取作为作者userId
的{{1}}并尝试显示个人资料。
然而,我一直很不成功,目前,我正在使用以下内容。发布每个用户的个人资料头像。
_id
//Need to filter this to show only OP.
Meteor.publish("userPostAvatar", function() {
return Meteor.users.find( {} ,
{
fields: {'profile.avatar': 1}
})
});
Meteor.publish('singlePost', function(id) {
check(id, String);
return Posts.find(id);
});
答案 0 :(得分:1)
您可以在userPostAvatar
发布功能中进行简单的连接,如下所示:
Meteor.publish('userPostAvatar', function(postId) {
check(postId, String);
var post = Posts.findOne(postId);
return Meteor.users.find(post.authorId, {fields: {profile: 1}});
});
这假定帖子有authorId
字段 - 根据您的用例需要进行调整。请注意三件重要的事情:
您需要使用this.params._id
订阅,就像对singlePost
订阅一样。
联接是非反应性的。如果作者更改,则不会重新发布头像。鉴于帖子的一般性质,我认为这不是问题。
我没有故意发布嵌套字段profile.avatar
,因为这样做会导致客户端出现奇怪的行为。有关详细信息,请参阅this question。
答案 1 :(得分:0)
我相信你可以在铁:路由器数据上下文中找到这个,通过查找帖子,关联作者(无论字段是什么),然后是后续用户头像。您可以将对象返回到iron:路由器数据上下文。然后,您可以在模板中访问post
和avatar
作为变量(因此您可能需要稍微调整模板输出)。
<强> Publications.js 强>
Meteor.publish("userPostAvatar", function() {
return Meteor.users.findOne( {} ,
{
fields: {'profile.avatar': 1}
})
});
Meteor.publish('singlePost', function(id) {
check(id, String);
return Posts.find(id);
});
<强> Router.js 强>
Router.route('/posts/:_id', {
name: 'postPage',
waitOn: function() {
return [
Meteor.subscribe('singlePost', this.params._id),
Meteor.subscribe('userStatus'),
Meteor.subscribe('userPostAvatar')
];
},
data: function() {
var post = Posts.findOne({_id: this.params._id});
var avatar = Users.findOne(post.authorId).profile.avatar;
return {
post: post,
avatar: avatar
};
}
});
这个方法的两个问题是你可以用模板助手实现同样的事情,用户出版物不仅限于一个用户(我不确定如何做到这一点,除非我们知道waitOn中的authorId,虽然也许您可以尝试将逻辑移动到那里而不是数据上下文,如我的示例所示。)