4

我正在尝试使用 Meteor 编写一个 web 应用程序,但我肯定无法理解有关订阅已发布数据集的一些事情。整个应用程序都在github 上(链接到后代的最新提交),但我将尝试在下面进行总结。

我有一个名为 teams 的集合,可供客户端和服务器使用:

Teams = new Meteor.Collection( "teams" );

在服务器上,我想发布所有团队的列表:

Meteor.publish( "allteams", function() { ...

有一个非常简单的光标构成了这个发布的列表:

var handle = Teams.find( {} ).observeChanges({
    added: function( id ) {
        console.log( "New team added" );
        if ( !initializing ) {
            console.log( "Telling subscribers it's all change" );
            self.added( "teams", id, {} );
            self.ready();
        }
    }
});

客户端订阅该源,当添加元素时,客户端会将引脚添加到地图:

Meteor.autorun( function() {
    Meteor.subscribe( "allteams", function() {
        console.log( "All teams has been updated" );
        // Do more stuff
    }
};

最初填充列表时,自动运行运行良好,但如果我向集合中添加另一个元素,则发布者方法会记录说“我注意到这一点”,但订阅者没有任何反应。

上述目的如下:

  • 服务器上有一个团队列表,其中包含名称和长/纬度详细信息
  • 当客户连接时,他们会收到该团队列表并绘制在地图上
  • 如果一个团队被添加到服务器端的列表中,每个客户端都会收到通知,并且地图上会出现一个新的图钉。

就应用程序而言,我可能不需要 pin 来神奇地出现,但这是学习发布和订阅的有用方法,尤其是当我没有正确使用时!最终,“allteams”可能会比整个团队列表更细粒度,所以我想这类似于查看数据。

我错过了一些完全明显的东西吗?

编辑:我解决了并将答案放在下面。tl;博士我根本没有订阅反应式数据源。

4

2 回答 2

13

回答我自己的问题可能不礼貌,但我弄清楚我做错了什么,我认为其他人可能会遇到同样的事情。

简单的答案是我没有做我在问题标题中声称要做的事情,特别是没有订阅反应数据源。

Meteor.autorun( function() {
    Meteor.subscribe( "allteams", function() {
        console.log( "All teams has been updated" );
        // Do more stuff
    }
};

在这里,我将subscribe方法传递给autorun,但该方法本身不是反应式数据源。但是,它返回的东西是!

// Define a subscription
var handle = Meteor.subscribe( "foo", { onReady: function() { ... } } );

Meteor.autorun( function() {
    if ( handle.ready() ) {
        // Now do something every time the subscription is marked as ready
    }
};

订阅句柄的ready方法是响应式的,因此现在每次更新发布的文档集时都会执行自动运行。这让我对多个客户端订阅数据库游标并监视更改的效率提出了进一步的问题,但我将在另一个问题中讨论这个问题。

于 2013-03-16T09:42:11.140 回答
0

如果自动发布仍然打开,这可能是您的问题的原因。尝试禁用自动发布并查看发布语句现在是否正常工作。

于 2013-03-14T06:51:12.920 回答