加载并等待“全球”流星订阅

时间:2014-12-03 23:23:03

标签: javascript meteor coffeescript

这是我的情景:

我有一个布局模板,需要检查用户是否属于至少一个团队。如果没有,则在整个站点上显示div。用户只能看到他们所属的团队,所以我创建了一个有效的简单出版物:(代码示例是CoffeeScript)

Meteor.publish 'teams', ->
  return null if !@userId
  Teams.find {'members._id': @userId}

这很好用,控制台中的Teams.find()。fetch()给出了预期的结果。

但是,如果我把这段代码放在Template.layout.rendered中,它就不起作用了。

Template.layout.rendered = ->
  teams = Teams.find().fetch()
  hasTeams = teams.length > 0
  if !hasTeams
    ...do stuff..

显然这不起作用,因为当需要做出决定时,团队发现异步并且没有加载。使用普通模板/页面我只会使用IronRouter waitOn(),但我该如何处理布局呢?

我可以在我的路由器中进行waitOn,但由于数据是" global"并且将在任何地方使用,并且由于用户可以在整个地方深入链接到该网站,我不想将waitOn添加到每条路线。

那么正确的模式是什么?如何在运行路由之前让meteor客户端加载全局数据并等待数据?

2 个答案:

答案 0 :(得分:2)

更多的思考和搜索在SO上找到答案:struggling to wait on subscriptions and multiple subscriptions

我将Router.configure改为:

Router.configure
  layoutTemplate: 'layout'
    waitOn: ->
     return [
       Meteor.subscribe('teams')
     ]

可以在返回数组中添加多个订阅,我相信它会等待所有订阅。

答案 1 :(得分:0)

我在使用waitOn的两个不同出版物中订阅聊天的铁路由器时遇到了类似的问题。

Meteor.subscribe('chats')

只有当我切换以下发布块的位置时,它才会让我看到路线上的任何数据。以下是两者的正确顺序。

Meteor.publish("chats", function () {
  return Chats.find();
});

Meteor.publish("chats", function(id) {
  return Chats.find({eventRoom: id});
});