meteor .publish на стороне сервера: работа с клиентской переменной

Я создаю чат и на основе чата, выбранного текущим пользователем, я хочу публиковать сообщения с помощью этой функции:

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

Теперь идентификатор чата все еще жестко запрограммирован, но он должен быть динамическим. Идентификатор чата передается в URL-адресе (например, .../chat/QMMjBgCvLcnLvJPvx). В клиентском коде я использовал для чтения chatId:

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

Железный маршрутизатор

Но это не работает на стороне сервера. Есть ли способ отправить chatId из URL-адреса на сервер, поэтому я использую Meteor.publish, как указано выше. Любая помощь приветствуется :)


person janjackson    schedule 06.06.2016    source источник
comment
Вы можете передать параметр при подписке на публикацию.   -  person L4zl0w    schedule 07.06.2016


Ответы (3)


Передайте переменную при подписке I.e.

Meteor.subscribe("messages", {chatId: Session.get("current-room")})

В публикации:

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

На своем маршруте вы можете подписаться на публикацию и передать параметр внутри waitOn, который заставит приложение показывать ваш шаблон загрузки до тех пор, пока подписка не будет готова, а идентификатор чата не станет реактивным.

Настройте шаблон загрузки:

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});
});
person Luna    schedule 07.06.2016

Спасибо за ваши ответы и подсказки. После еще нескольких модификаций я пришел к этому, что решило проблему:

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