Meteor 流星:插入后集合为空

Meteor 流星:插入后集合为空,meteor,Meteor,我是流星的新手,被绊倒了,不明白自己做错了什么。请开导我 以下是HTML文件: <body> <h1>Do</h1> {{#if activeTask}} {{> currentTask}} {{else}} {{> newTask }} {{/if}} <div> </div> </body> <template name="newTask">

我是流星的新手,被绊倒了,不明白自己做错了什么。请开导我

以下是HTML文件:

<body>

  <h1>Do</h1>
  {{#if activeTask}}
    {{> currentTask}}
  {{else}}
    {{> newTask }}
  {{/if}}

  <div>

  </div>

</body>


<template name="newTask">
  <form>
    <label>What<input type="text" name="what" placeholder="gimme an action"/></label>
    <input type="submit" value="Go"/>
  </form>

  <!--
  {{> inputAutocomplete settings=settings id="msg" class="input-xlarge" placeholder="action"}}
  -->

</template>

<template name="currentTask">
  <form>
    <label>What<input type="text" name="what" placeholder="gimme an action"/>{{activeTask.what}}</label>
    <div>4h 15m</div>
    <input type="submit" value="Stop"/>
  </form>
</template>

它成功地将一个新文档添加到数据库中,并将其记录在助手activeTask中。一步之后,它就不再记录任何任务了。它走了。但是为什么呢?

如果没有安装包
autopublish
(),则需要创建发布(客户端)和订阅(服务器端):


我在最近的一篇博客文章中也解释过。

一步之后是什么?我已经试过你的例子了,似乎效果不错。首先,它显示模板
newTask
——添加一个模板后,它只显示
activeTask
。如果您想再次看到
newTask
,您需要更改模板逻辑。这很奇怪。在我的环境中,它总是显示newTask,并在控制台中为我提供一个未定义的输出作为最后的输出。第一个输出是新创建的文档,第二个输出是未定义的。为什么他在提交表单后两次调用activeTask?您使用的是什么操作系统。您的项目文件夹中还有其他JS文件吗?请同时发布您的
/.meteor/packages
文件。可能只是一个访问问题(不安全/自动发布)啊,我从一个示例localmarket创建了它。我能做的最好的事情是删除整个项目并重新开始。我假设您的代码是正确的,而您只是缺少发布/订阅(请参阅下面的答案)。
tasks = new Mongo.Collection('tasks');

if (Meteor.isClient) {

  Template.body.helpers({

    activeTask: function() {
      var task = tasks.findOne(
        {
          endAt: null
        },
        {
          sort: {
            startAt: -1
          }
        }
      );
      console.log(task);
      return task;
    }

  });

  Template.newTask.events({
    'submit' : function(event) {
      event.preventDefault();
      var now = Date.now();
      var what = event.target.what.value;
      tasks.insert({ what: what, startAt: now, endAt: null });
    }
  });

}
if (Meteor.isServer) {
  Meteor.publish('tasks', function () {
    return tasks.find();
  });
}

if (Meteor.isClient) {
  Meteor.subscribe('tasks');
}