【问题标题】:Loading and waiting for "global" meteor subscriptions加载并等待“全球”流星订阅
【发布时间】:2015-12-28 06:57:14
【问题描述】:

这是我的场景:

我有一个布局模板,需要检查用户是否至少属于一个团队。如果没有,则在整个站点上显示一个 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,但由于数据是“全球性的”并且将在任何地方使用,并且因为用户可以深入链接到整个地方的站点,我不想添加它等待每条路线。

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

【问题讨论】:

    标签: javascript meteor coffeescript


    【解决方案1】:

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

    我将 Router.configure 更改为:

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

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

    【讨论】:

      【解决方案2】:

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

      Meteor.subscribe('chats')
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2012-10-01
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 2014-05-04
        相关资源
        最近更新 更多