Meteor Streams:客户端不接收流

时间:2013-07-31 12:14:38

标签: meteor

我正在开发一个基于meteor和MeteorStreams的简单应用程序。 目标很简单:     一个用户将点击一个按钮来创建一个房间     其他用户将加入该房间     这些用户可以使用简单的消息发出流     创建者将收听该消息,然后显示它们

实际上:发送来自其他用户的消息(登录服务器脚本),但创建者没有收到它们。 如果我重新加载创建者的页面,那么它将从其他用户发送消息。

我真的不明白为什么它第一次没有工作。

我使用meteor-router作为我的路由系统。 代码可以在这里看到

  

https://github.com/Rebolon/MeetingTimeCost/tree/feature/pokerVoteProtection

客户端代码在client / views / poker / *和client / helpers中是可用的 服务器流的代码在server / pokerStreams.js

可以在此处测试应用程序:http://meetingtimecost.meteor.com 必须记录创建者。

如果您有任何想法,欢迎任何帮助。 感谢

1 个答案:

答案 0 :(得分:2)

好的,好的, 在做了一些调试之后,我现在明白了我的代码中出了什么问题: 事实很简单。问题来自于我忘记将Stream.on事件绑定到Deps.autorun的事实。 结果是这部分代码不是由反应性管理的,因此当Session更改时它永远不会自动重新运行。

使用Meteor解决方案非常简单:只需将这部分代码包装在Deps.autorun中

Meteor.startup(function () {
  Deps.autorun(function funcReloadStreamListeningOnNewRoom () {
    PokerStream.on(Session.get('currentRoom') + ':currentRoom:vote', function (vote) {
      var voteFound = 0;
      // update is now allowed
      if (Session.get('pokerVoteStatus') === 'voting') {
        voteFound = Vote.find({subscriptionId: this.subscriptionId});
        if (!voteFound.count()) {
          Vote.insert({value: vote, userId: this.userId, subscriptionId: this.subscriptionId});
        } else {
          Vote.update({_id: voteFound._id}, {$set: {value: vote}});
        }
      }
    });
  });
});

所以这不是Meteor Streams的问题,而只是我的错。 希望它能帮助人们理解在模板和集合之外,如果你想要反应,你需要将你的代码包装在Deps中。