这是我的情景:
我有一个布局模板,需要检查用户是否属于至少一个团队。如果没有,则在整个站点上显示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客户端加载全局数据并等待数据?
答案 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});
});