我有一个我订阅的集合,但是当我尝试从我的onRendered
事件中访问它时,它总是返回一个空数组。以下是我使用的方法:
FlightCounts = new Mongo.Collection("flightCounts");
if (Meteor.isClient) {
Meteor.subscribe('flightCounts');
Template.hello.rendered = function(){
var counts = FlightCounts.find().fetch()
console.log(counts)
}
}
if (Meteor.isServer) {
Meteor.startup(function () {
// code to run on server at startup
Meteor.publish('flightCounts', function(){
return flightCounts.find();
})
});
}
任何人都可以看到为什么我的收藏品总是空着的?有关如何填充它的任何建议吗?
答案 0 :(得分:2)
if (Meteor.isClient) {
Meteor.subscribe('flightCounts');
Template.hello.rendered = function() {
var template = this;
template.autorun(function () {
var counts = FlightCounts.find().fetch()
console.log(counts)
});
}
}
您的集合未填充,因为它仍然从服务器获取数据。因此,您应该将代码包装在自动运行中,以便在数据更新时重新运行。
P.S:我在移动设备上,因此格式化可能不合适。对不起。
答案 1 :(得分:2)
根本问题是发布功能应引用Meteor的Mongo.Collection
名称FlightCounts
,而不是原始db.collection
名称flightCounts
:
Meteor.publish('flightCounts', function(){
return FlightCounts.find();
});
我同意先前的答案,您的模板应该在记录数据之前检查以确保订阅准备就绪,否则它可能尚未到达:
Template.hello.onRendered(function(){
this.autorun(() => {
let ready = Template.instance().subscriptionsReady();
if (!ready){ return; }
let counts = FlightCounts.find().fetch();
console.log(counts);
});
});
(请注意,Template.name.rendered
的较新语法为Template.name.onRendered()
。)
答案 2 :(得分:1)
或者,您可以使用subscriptions
的{{1}}或FlowRouter
的{{1}}来订阅
更新令人惊讶的是,waitOn
现在还有IronRouter
选项