为什么在以下基本示例中,渲染函数内的返回集合是空的?
自动发布已启用。页面加载调用命令后
javascript控制台中的Coll.find().fetch()
会返回正确的条目集
这是代码
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>
答案 0 :(得分:5)
Meteor是基于线上数据类型结构构建的。这意味着应用程序最初加载HTML&amp;首先发送JS,然后发送数据。
您必须使用反应性来检查数据更改或检查集合的订阅何时完成(这需要删除自动发布包)。 (您可以在文档中查看如何将您的应用移至手动订阅:http://docs.meteor.com/#publishandsubscribe)
订阅回调会告诉您何时返回数据:
Meteor.subscribe("coll", function() {
//Data subscription complete. All data is downloaded
});
模板也可以被激活(就像你正在做的那样)但.rendered
没有被调用,因为Meteor首先检查模板的html是否已经改变&amp; 只有它不同才会更改其HTML并调用呈现的回调。
您在此处选择的是1)使用Deps.autorun代替,或
2)我不确定你为什么在渲染回调中使用它,但是如果有必要将它放在那里你需要通过在你的集合中的html中引入一些内容来确保模板的HTML发生变化在引入新数据时使其发生变化。