为什么此代码显示“0”?它不应该返回“1”吗?
Messages = new Meteor.Collection("messages");
if (Meteor.is_client) {
Meteor.startup(function () {
alert(Messages.find().count());
});
}
if (Meteor.is_server) {
Meteor.startup(function () {
Messages.insert({text: "server says hello"});
});
}
如果我稍后执行“Messages.find()。count()”,则返回1.
答案 0 :(得分:37)
默认情况下,当Meteor客户端启动时,它会连接到服务器并订阅您定义的任何Meteor.Collection
中的文档。这需要一些时间才能完成,因为在建立服务器连接和接收文档时总会有一些延迟。
Meteor.startup()
与jQuery中的$()
非常相似 - 它在客户端DOM准备好后运行其参数。它 not 等待客户的集合从服务器接收所有文档。因此,编写代码的方式,对find()
的调用将始终过早运行并返回0.
如果要等到第一次从服务器下载集合之后再运行代码,则需要使用Meteor.subscribe()
显式订阅集合。 subscribe()
接受将在客户端上的初始文档集运行时运行的回调。
请参阅:
答案 1 :(得分:0)
只需跟进一个代码示例,了解如何知道集合何时可以在客户端上使用。
如@debergalis所述,您应该使用Meteor.subscribe方法 - 它会接受几个回调,特别是onReady
例如:
if(Meteor.isClient){
Meteor.subscribe("myCollection", {
onReady: function(){
// do stuff with my collection
}
});
}