22

为什么这段代码显示“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。

4

2 回答 2

37

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

Meteor.startup()on client 很像$()jQuery —— 一旦客户端 DOM 准备好,它就会运行它的参数。它不会等待客户的集合从服务器接收所有文档。因此,按照您编写代码的方式,调用find()总是会运行得太早并返回 0。

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

看:

流星发布流星订阅

于 2012-04-11T06:29:04.013 回答
0

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

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

例如:

if(Meteor.isClient){

    Meteor.subscribe("myCollection", {

        onReady: function(){

            // do stuff with my collection

        }

    });

}
于 2016-05-26T01:12:22.040 回答