我正在尝试使用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订阅句柄的方法是被动的,因此每次更新已发布的文档集时都会执行自动运行.这让我进一步质疑多个客户订阅数据库游标并观察变化的效率,但我会在另一个问题中提到这一点.
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |