服务器端的meteor .publish:使用客户端变量

时间:2016-06-06 20:27:31

标签: meteor chat publish-subscribe

我正在建立一个聊天,并根据currentUser选择的聊天室,我想发布带有此功能的消息:

Meteor.publish('messages',function(){
  return Messages.find(
    {chatId: 'QMMjBgCvLcnLvJPvx'},
    sort:{timestamp: -1}
  });
});

现在chatId仍然是硬编码的,但它需要是动态的。 chatId在URL中传递(例如.../chat/QMMjBgCvLcnLvJPvx)。在基于客户端的代码中,我习惯阅读chatId

var chatId = Router.current().params._id;

铁路由器

但这不适用于服务器端。有没有办法将chatId从URL发送到服务器,所以我使用如上所述的Meteor.publish。任何帮助表示赞赏:)

3 个答案:

答案 0 :(得分:1)

订阅I.e。

时传入变量
Meteor.subscribe("messages", {chatId: Session.get("current-room")})

在出版物中:

Meteor.publish('messages',function(chatId){
  return Messages.find(
    {chatId: chatId},
    sort:{timestamp: -1}
  });
});

答案 1 :(得分:1)

在您的路线中,您可以订阅发布并在waitOn内传递一个参数,这将导致应用显示您的加载模板,直到订阅准备就绪并且chatId将被激活。

配置加载模板:

Router.configure({
    layoutTemplate:'templateName',
    loadingTemplate: 'anotherTemplateName'
});

您的路线:

Router.route('/chat/:_id',{
    waitOn: function(){
        return Meteor.subscribe('messages', this.params._id);
    },

    action: function(){
        //render your template with data
        this.render('templateName', {
            data: function () {
                //will return object to the template which you can use in both HTML and JS. Also necessary for the link.
                return Somethings.findOne({_id: this.params._id})
            }
        })
    }
});

公开:

Meteor.publish("messages", function (chatId) {
    //the chatId comes from our subscribe in our route
    return Messages.find({chatId: chatId});
});

答案 2 :(得分:1)

感谢您的回答和提示。经过一些修改,我到达了这个,解决了这个问题:

  var chatId = Router.current().params._id
  this.wait(Meteor.subscribe('messages', chatId));