流星路由,发布/订阅

时间:2015-03-13 02:41:42

标签: javascript mongodb meteor publish-subscribe iron-router

我试图发布一个发布声明 只有作者(OP)的个人资料头像。我想抓住页面的_id。在该页面中,我将抓取作为作者userId的{​​{1}}并尝试显示个人资料。

然而,我一直很不成功,目前,我正在使用以下内容。发布每个用户的个人资料头像。

Publications.js

_id


Router.js

//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);
});

2 个答案:

答案 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:路由器数据上下文。然后,您可以在模板中访问postavatar作为变量(因此您可能需要稍微调整模板输出)。

<强> 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,虽然也许您可以尝试将逻辑移动到那里而不是数据上下文,如我的示例所示。)