Meteor onRendered函数和对集合的访问

时间:2015-07-20 16:57:10

标签: mongodb meteor collections

当用户刷新某个页面时,我想从mongoDB数据库中设置一些初始值。

我尝试使用onRendered方法,该方法在文档状态中将在运行它的模板插入DOM时运行。但是,该实例的数据库不可用?

当我尝试从函数访问数据库时:

Template.scienceMC.onRendered(function() {
    var currentRad = radiationCollection.find().fetch()[0].rad;
}

我收到以下错误消息:

Exception from Tracker afterFlush function:
TypeError: Cannot read property 'rad' of undefined

但是,当我在控制台中运行行radiationCollection.find().fetch()[0].rad;时,我可以访问值吗?

如何确保mongoDB的副本可用?

3 个答案:

答案 0 :(得分:1)

对我来说最好的方法是在路由器中使用waitOn功能。感谢@David Weldon提示。

immutable

答案 1 :(得分:0)

你需要设置一个正确的出版物(好像你做了)并订阅路线参数。如果您想确保在#include <stdio.h> int main() { int i, numberOfNumbs=0,total=0,value, valsRead; float average; valsRead = scanf("%d",&value); while(valsRead>0) { numberOfNumbs++; total +=value; printf("Read %d\n", value); valsRead = scanf("%d",&value); } average=(float)total/(float)numberOfNumbs; printf("You read %d values. Average = %f.",numberOfNumbs, average); return (0); } 函数中有效地拥有数据,则需要添加额外的步骤。

以下是如何在路线定义中制作它的示例:

onRendered

在此示例中,您可以使用this.templateController = RouteController.extend({ template: "YourTemplate", action: function() { if(this.isReady()) { this.render(); } else { this.render("yourTemplate"); this.render("loading");} /*ACTION_FUNCTION*/ }, isReady: function() { var subs = [ Meteor.subscribe("yoursubscription1"), Meteor.subscribe("yoursubscription2") ]; var ready = true; _.each(subs, function(sub) { if(!sub.ready()) ready = false; }); return ready; }, data: function() { return { params: this.params || {}, //if you have params yourData: radiationCollection.find() }; } }); onRendered

this.data.yourData函数中获取数据

编辑:正如@David Weldon在评论中所述,您还可以使用更简单的替代方案:waitOn

答案 2 :(得分:0)

我无法看到您的收藏品,因此我无法保证 rad 是您收藏中的钥匙,也就是说我相信您的问题是您的收藏品尚无法使用。正如@David Weldon所说,你需要保护或等待你的订阅可用(记住它必须加载)。

我在铁路上做的是:

data:function(){
    var currentRad = radiationCollection.find().fetch()[0].rad;
    if (typeof currentRad != 'undefined') {
        // if typeof currentRad is not undefined
        return currentRad;
    }
}