2014-12-03 59 views
0

这是我的场景:加载和等待“全球”流星订阅

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

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

这个伟大的工程和Teams.find()获取()在控制台提供预期结果。

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

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

显然这不起作用,因为团队发现是异步的,并且在需要做出决定时没有加载。使用普通的模板/页面,我只需使用IronRouter waitOn(),但是我在布局上做了什么?

我可以在我的路由器上做一个waitOn,但由于数据是“全局的”并将在任何地方使用,并且由于用户可以深入链接到站点到处,我不想添加waitOn到每一个单一的路线。

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

回答

2

更多的思考与探索发现答案就在这里SO:struggling to wait on subscriptions and multiple subscriptions

我改变了我的Router.configure这样:

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

多个订阅可以被添加到返回数组,我相信它会等待所有的人。

0

我有一个类似的问题,铁路由器订阅聊天在waitOn两个不同的出版物。

Meteor.subscribe('chats') 

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

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

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