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

pom*_*ber 22 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"});
    });
}
Run Code Online (Sandbox Code Playgroud)

如果我稍后执行"Messages.find().count()",则返回1.

deb*_*lis 37

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

Meteor.startup()在客户端上很像$()jQuery - 它在客户端DOM准备好后运行它的参数.它不是等待客户的集合,以获得他们的服务器上的所有文件.所以你编写代码的方式,调用find()总是会过早运行并返回0.

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

看到:

流星发布流星订阅

  • 我很想看到如何执行此操作的代码示例. (9认同)
  • @bijan(或其他有同样问题的人),是的你需要删除自动发布包:$ meteor remove autopublish. (3认同)