流星发布/订阅集合的子集

时间:2014-08-01 18:39:46

标签: javascript coffeescript meteor iron-router

我正在尝试为聊天室功能做一个pub / sub。我需要做的是,发布“Chatrooms”的子集,其中包含字段user1 =当前用户ID,或者其具有字段user2 =当前用户ID的位置。所以我的代码在coffeescript中看起来像这样:

Meteor.publish "chatrooms1", publishFunction1 = ->
  Chatrooms.find
    user1: @userId

Meteor.publish "chatrooms2", publishFunction2 = ->
  Chatrooms.find
    user2: @userId

在我的订阅中,如果用户已登录,我希望它只订阅聊天室:

Router.map () ->
  @route 'home',
  path: '/'

  waitOn: ->
    [
      Meteor.subscribe('users')
      Meteor.subscribe('instruments')
      Meteor.subscribe('instrumentList')
    ]
  if Meteor.user()
    waitOn: ->
      [
        Meteor.subscribe('chatrooms1')
        Meteor.subscribe('chatrooms2')
      ]

不确定我在这里做错了什么,pub / sub不能正常工作,因此页面无法加载。 在这一步之后,我将尝试使子部分中的if Meteor.user()处于反应状态,但这将在稍后进行。

1 个答案:

答案 0 :(得分:0)

我认为这主要是一个CoffeeScript问题 - 你不能在对象文字的中间有一个if(如果有疑问,你可以将代码粘贴到&#中39;尝试coffeesctipt' tab here)。已编译的代码不会将第二个waitOn添加到您的路线中。尝试这样的东西:

Router.map ->
  @route 'home',
    path: '/'

    waitOn: ->
      subs = [
        Meteor.subscribe 'users'
        Meteor.subscribe 'instruments'
        Meteor.subscribe 'instrumentList'
      ]

      if Meteor.user()
        subs.push Meteor.subscribe 'chatrooms1'
        subs.push Meteor.subscribe 'chatrooms2'

      subs

或者,您可以将聊天室出版物简化为一个功能:

Meteor.publish 'chatrooms', ->
  return @ready() unless @userId
  Chatrooms.find $or: [{user1: @userId}, {user2: @userId}]

请注意,如果用户未登录,它会立即返回就绪状态。然后您的路线将是:

Router.map ->
  @route 'home',
    path: '/'

    waitOn: -> [
        Meteor.subscribe 'users'
        Meteor.subscribe 'instruments'
        Meteor.subscribe 'instrumentList'
        Meteor.subscribe 'chatrooms'
    ]