2016-11-21 23 views
0

這裏是我的模板onCreated和helper函數。我提供了內嵌評論以增加一些清晰度。我可以看到self.post最終被設置,因爲當我登錄Template.instance()時,它顯示在我的控制檯上。但是,當我登錄Template.instance()。post時,它始終未定義。如何在模板onCreated中使用findOne並在幫助器中訪問它

Template.default.onCreated(function() { 
    var self = this; 
    self.autorun(function() { 
     var postId = FlowRouter.getParam('post_id'); 
     self.subscribe('onePost', postId); 
     self.post = Posts.findOne(FlowRouter.getParam('post_id')); 
    }); 
}); 
Template.default.helpers({ 
    poststage: function(stage) { 
     console.log(Template.instance()); // I can see post object here 
     console.log(Template.instance().post; //always undefined 
     if(Template.instance().post) { 
      // never true 
      return Template.instance().post.stage == stage; 
     } 
    } 
}); 
Template.default.events({ 
    'submit form':function(event, instance) { 
     Meteor.call('someFunc', instance.post.anotherField); 
    } 
}); 

編輯:我要補充,我試圖避免編寫查詢兩次,因爲我也是在模板事件使用它。 (見代碼)。

+0

Reactivevar可能有幫助,對meteorchef反應 –

+0

findOne默認是被動的。 –

回答

0

這感覺就像是一個計時問題。您正在訂閱onePost發佈,但您在分配self.post之前並未等待該訂閱爲.ready()autorun也似乎是多餘的。您不需要在onCreated塊中重新運行該代碼塊。我建議:

Template.default.onCreated(function() { 
    this.postId = FlowRouter.getParam('post_id'); 
    self.subscription = subscribe('onePost', this.postId); 
}); 
Template.default.helpers({ 
    poststage: function(stage) { 
    if (this.subscription.ready() ){ 
     return Posts.findOne(this.postId).stage; 
    } 
    } 
}); 
+0

好的,是的,這就是我通常會這樣做的方式,但是我稍後在代碼中重新使用查詢(在事件中)。我實際上正在考慮改寫這個問題來反映這一點(我現在要做)。答案可能只是寫Posts.findOne ...。但是,我在想爲什麼要查詢兩次? –

+0

minimongo查詢相對便宜,通常比將自己編碼到優化它們的角落便宜。你也可以在包含模板中查詢數據上下文,然後在'this'查詢結果。' –

+0

好吧,我將只查詢兩次。我將把這個問題保留開放,可能會對此稍加說明,試圖指定如何編寫一個查詢並在Template onCreated,helpers和events中使用它。最令人沮喪的是,我的帖子在console.log(Template.instance())中可用;但不在Template.instance()。post中。我知道它變得可用,但它應該在日誌記錄時,它變得可用....噢,以及... –

相關問題