流星路由,Pub/Sub

Meteor Routing, Pub/Sub

我正在尝试发布发布声明 只有作者(OP)的个人资料头像。我正在考虑获取页面的 _id。从该页面,我将获取作者的 _id userId 并尝试显示个人资料。

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

Publications.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);
});

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() { 
        return Posts.findOne({_id:this.params._id});
     }
});

我相信您可以在 iron:router 数据上下文中实现此目的,方法是查找 post、相关作者(无论字段是什么),然后是后续用户头像。您可以 return 一个对象到 iron:router 数据上下文。然后您可以访问模板中的 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,虽然也许您可以尝试将逻辑移到那里而不是像我的示例所示的数据上下文)。

您可以像这样在 userPostAvatar 发布函数中进行简单的连接:

Meteor.publish('userPostAvatar', function(postId) {
  check(postId, String);
  var post = Posts.findOne(postId);
  return Meteor.users.find(post.authorId, {fields: {profile: 1}});
});

这假设帖子有一个 authorId 字段 - 根据您的用例需要进行调整。注意三件重要的事情:

  • 您需要像订阅 singlePost 一样使用 this.params._id 订阅。

  • 加入是非反应性的。若作者变更,头像将不再重新发布。鉴于帖子的一般性质,我认为这不是问题。

  • 我不是故意发布嵌套字段 profile.avatar 的,因为这样做会导致客户端出现奇怪的行为。有关详细信息,请参阅