2015-07-20 27 views
1

當用戶刷新某個頁面時,我想從mongoDB數據庫中設置一些初始值。流星onRWendered函數和對集合的訪問

我試過使用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的副本可用?

+0

你使用鐵路由器嗎? – Billybobbonnet

+0

@Billybobbonnet是的,我已經添加了路由器軟件包,並且只在此刻才使用它將http導向模板。 –

+0

@ArashSaidi你需要「等待」你的數據或保護它。我在[本文]中詳細解釋了這些技術(http://dweldon.silvrback.com/guards)。 –

回答

1

對我來說,最好的辦法是使用waitOn功能的路由器。感謝@David Weldon的提示。

Router.route('/templateName', { 
    waitOn: function() { 
     return Meteor.subscribe('collectionName'); 
    }, 
    action: function() { 
     // render all templates and regions for this route 
     this.render(); 
    } 
}); 
0

您需要設置一個正確的出版物(看起來您已經做過)並在路徑參數中進行訂閱。如果你想確保你的你的數據在onRendered功能,你需要添加一個額外的步驟。

下面是如何讓它在你的路由定義一個例子:,您的數據都使用this.data.yourDataradiationCollection.find()

編輯

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功能:正如@David Weldon在評論中指出的那樣,您還可以使用更簡單的替代方案:waitOn

+0

這似乎很多,只是爲了獲得我已經訂閱的數據?我希望有一個更優雅的方式來做到這一點? –

+0

我不確定你的意思。除了您的發佈,在您的路由選項中,只有在訂閱已準備就緒的情況下,才能加載模板。這樣,您可以在模板呈現時獲取數據。你爲什麼認爲它不夠優雅? – Billybobbonnet

0

我看不到您的收藏,所以我不能保證rad是您收藏中的關鍵,也就是說我相信您的問題是您的收藏尚未推出。正如@David Weldon所說,你需要保護或等待你的訂閱可用(記住它必須加載)。

我在ironrouter做到這一點:

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