Meteor template.rendered - 为什么收集是空的?

Elr*_*rot 6 meteor

为什么在以下基本示例中返回的集合在渲染函数内是空的?
自动发布已启用.页面加载
Coll.find().fetch()javascript控制台内的调用命令后返回正确的条目集

这是代码

t.js

Coll = new  Meteor.Collection("coll");

if (Meteor.isClient) {
  Template.tpl.rendered = function(){
    console.log(Coll.find().fetch()); // <-- This line prints empty array
  };
}

if (Meteor.isServer) {
  Meteor.startup(function () {
      if (Coll.find().count() === 0) {
          var f = ["foo","bar"];
          for (var i = 0; i < f.length; i++)
              Coll.insert({f: f[i]});
      }
  });
}
Run Code Online (Sandbox Code Playgroud)

t.html提交

<head>
  <title>test</title>
</head>

<body>
  {{> tpl}}
</body>

<template name="tpl">
  Test tpl
</template>
Run Code Online (Sandbox Code Playgroud)

Aks*_*hat 5

Meteor是基于线上数据类型结构构建的.这意味着当应用程序最初加载时,首先发送HTML&JS,然后发送数据.

您必须使用反应性来检查数据更改或检查集合的订阅何时完成(这需要删除自动发布包).(您可以在文档中查看如何将您的应用移至手动订阅:http://docs.meteor.com/#publishandsubscribe)

订阅回调会告诉您何时返回数据:

Meteor.subscribe("coll", function() {
    //Data subscription complete. All data is downloaded
});
Run Code Online (Sandbox Code Playgroud)

模板也可以被激活(就像你正在做的那样)但是.rendered没有被调用,因为Meteor首先检查模板的html是否已经改变,只有当它不同时才会改变它的HTML并调用渲染的回调.

你在这里选择的是1)使用Deps.autorun,或者

2)我不确定你为什么在渲染回调中使用它,但是如果有必要将它放在那里你需要确保模板的HTML发生变化,通过在你的集合中引入一些内容来改变它何时引入新数据.