使用自动运行订阅活动数据源

cho*_*ban 4 meteor

我正在尝试使用Meteor编写一个webapp,我肯定没有想到订阅已发布的数据集.整个应用程序都在github上(链接到后代的最新提交),但我将尝试总结如下.

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

Teams = new Meteor.Collection( "teams" );
Run Code Online (Sandbox Code Playgroud)

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

Meteor.publish( "allteams", function() { ...
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

客户端订阅该源,并且在添加元素时,客户端将向地图添加引脚:

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

最初填充列表时,自动运行运行正常,但如果我将另一个元素添加到集合中,则发布方法会记录为"我注意到了这一点",但订阅者中没有任何操作.

以上的目的如下:

  • 服务器上有一个团队列表,其中包含名称和长/拉特详细信息
  • 当客户端连接时,他们会收到该团队列表,并将其绘制在地图上
  • 如果团队被添加到服务器端的列表中,则会通知每个客户端并在地图上显示新的引脚.

在应用程序方面,我可能不需要引脚神奇地出现,但它是学习发布和订阅的有用方式,尤其是当我没有正确的时候!最终,"allteams"可能会比整个团队列表更精细,所以我想这类似于对数据进行观察.

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

编辑:我把它解决了,并把答案放在下面.tl; dr我根本没有订阅反应数据源.

cho*_*ban 13

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

简单的回答是,我没有按照我声称要在queston的标题中做的事情,特别是没有订阅被动数据源.

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

这里我已经将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
    }
};
Run Code Online (Sandbox Code Playgroud)

ready订阅句柄的方法是被动的,因此每次更新已发布的文档集时都会执行自动运行.这让我进一步质疑多个客户订阅数据库游标并观察变化的效率,但我会在另一个问题中提到这一点.