6

为什么在以下基本示例中,渲染函数内返回的集合为空?
自动发布已启用。
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]});
      }
  });
}

t.html归档

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

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

<template name="tpl">
  Test tpl
</template>
4

1 回答 1

5

Meteor 是建立在数据在线类型结构之上的。这意味着当应用程序最初加载 HTML 和 JS 时,首先向下发送数据,然后再发送数据。

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

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

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

模板也可以是反应式的(就像你正在做的那样)但.rendered不会被调用,因为 Meteor 首先检查模板的 html 是否已更改,并且只有当它不同时才会更改其 HTML 并调用呈现的回调。

您在这里可以选择 1) 改用Deps.autorun,或者

2)我不确定你为什么在渲染的回调中使用它,但如果有必要把它放在那里,你需要确保模板的 HTML 发生变化,方法是从你的集合中引入一些东西到 html 中,使它改变当引入新数据时。

于 2013-05-01T08:02:39.627 回答