Meteor - 在客户端启动时使用集合

时间:2012-04-11 04:50:43

标签: meteor

为什么此代码显示“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.

2 个答案:

答案 0 :(得分:37)

默认情况下,当Meteor客户端启动时,它会连接到服务器并订阅您定义的任何Meteor.Collection中的文档。这需要一些时间才能完成,因为在建立服务器连接和接收文档时总会有一些延迟。

客户端上的

Meteor.startup()与jQuery中的$()非常相似 - 它在客户端DOM准备好后运行其参数。它 not 等待客户的集合从服务器接收所有文档。因此,编写代码的方式,对find()的调用将始终过早运行并返回0.

如果要等到第一次从服务器下载集合之后再运行代码,则需要使用Meteor.subscribe()显式订阅集合。 subscribe()接受将在客户端上的初始文档集运行时运行的回调。

请参阅:

meteor-publishmeteor-subscribe

答案 1 :(得分:0)

只需跟进一个代码示例,了解如何知道集合何时可以在客户端上使用。

@debergalis所述,您应该使用Meteor.subscribe方法 - 它会接受几个回调,特别是onReady

例如:

if(Meteor.isClient){

    Meteor.subscribe("myCollection", {

        onReady: function(){

            // do stuff with my collection

        }

    });

}