1

我有这个简单的代码,基本上是尝试从头开始重新创建 Players 示例。我用一条线创建了一个项目

meteor create simpl

并拥有此代码

Players = new Meteor.Collection("players");

if (Meteor.isClient) {
  Meteor.startup(function () {
    console.log(Players.find().count());
  });


if (Meteor.isServer) {
  Meteor.startup(function () {
    if (Players.find().count() === 0) {
      Players.insert({name:"meteor"});
      Players.insert({name:"meteor1"});
    }
  });
}

控制台输出0。Leaderboard示例中插入和检索的相等代码按预期工作,但不是这个。我在项目的代码或创建中做错了吗?

更新:

在阅读了一些关于在服务器上发布和在客户端订阅的要求的评论和答案之后,我想问一下为什么排行榜示例没有这样的代码,但可以按我的预期工作。

4

3 回答 3

2

Meteor 是使用在线数据原理构建的。因此,当加载 javascript 时,您的集合仍然需要从服务器下载。

如果您等待一小段时间,然后运行console.log(Players.find().count());它应该可以按您的意愿工作。当集合发生变化时,使用以下方法(因为Deps.autorun)将重新运行:Players

Tracker.autorun(function() {
    console.log(Players.find().count());
});

最初它会打印0,但是当下载数据时它会增加。

另一种选择是使用订阅回调来确定何时从服务器下载了所有数据。

于 2013-06-16T14:23:53.153 回答
2

排行榜示例附带 Autopublish(此处的有限文档:http://docs.meteor.com/#dataandsecurity 。Autopublish 本质上是对所有客户端的所有数据进行全局发布-订阅。它不安全,但这就是排行榜示例没有发布或订阅功能的原因

于 2013-11-04T18:50:52.530 回答
0

您需要发布收集服务器端,然后订阅客户端

检查流星文档

于 2013-06-16T14:12:55.150 回答