繁体   English   中英

流星路由,发布/订阅

[英]Meteor Routing, Pub/Sub

我正在尝试发表发表声明,以仅发表author(OP)的个人资料头像。 我正在考虑获取页面的_id 而从该页面中,我将抓住userId这是笔者的_id ,并尝试以显示个人资料。

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

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

您可以在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 ,因为这样做会导致客户端出现奇怪的行为。 有关更多详细信息,请参见此问题

我相信您可以在iron:router数据上下文中实现此目的,方法是查找帖子,关联的作者(无论该字段是什么),然后查找后续的用户头像。 您可以将对象返回到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中的authorId,尽管也许您可以尝试将逻辑移到那里而不是如我的示例所示的数据上下文)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM