【问题标题】:Meteor Routing, Pub/Sub流星路由,发布/订阅
【发布时间】:2015-05-15 10:49:11
【问题描述】:

我正在尝试发表发布声明以发布 只有作者(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});
     }
});

【问题讨论】:

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


    【解决方案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 字段 - 根据您的用例需要进行调整。注意三个重要的事情:

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

    • 连接是非反应性的。如果作者更改,头像将不会重新发布。鉴于帖子的一般性质,我认为这不是问题。

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

    【讨论】:

    • 完美运行谢谢!
    【解决方案2】:

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

    【讨论】:

    • 谢谢伊恩!但我最终使用了下面的解决方案:)
    • Nps,我不知道为什么我没有想到其他解决方案!
    猜你喜欢
    • 2014-05-04
    • 2023-03-31
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2018-12-18
    • 2018-12-26
    相关资源
    最近更新 更多