2015-11-15 34 views
1

我很難過這裏。我無法從onCreated方法中找到收集。如果我在通話之前記錄data.source_id,然後在控制檯中執行相同的查找,它會找到它。有什麼特別的關於onCreated什麼的?我只是做錯了嗎?流星 - 創建收藏查詢

客戶機/ setup.js

Meteor.subscribe('source_elements'); 
Meteor.subscribe('internal_elements'); 

客戶機/ submit.js

Router.route('/element/submit', function() { 
    this.render('submit', { 
     data: { 
      source_id: this.params.query.source_id, 
     }, 
    }); 
}); 


Template.submit.onCreated(function() { 
    var data = Template.instance().data; 
    var source_element = SourceElements.findOne({'_id': data.source_id}); 

    console.log(source_element); // EMPTY!! 
}); 


Template.submit.helpers({ 
    element: function() { 
     var data = Template.instance().data; 
     var source_element = SourceElements.findOne({'_id': data.source_id}); 

     console.log(source_element); // RESULT!! 

     return source_element; 
    }, 
}); 
+0

我看到如果我將調用移動到助手,它會運行幾次(出於某種原因)並最終找到它。但是第一次迭代出現了「未定義」。也許它與'onCreated'方法中的'return'語句有關?或者可能不使用'ReactiveVar'? – Scott

+0

你在哪裏訂閱'SourceElements'? – chrisklaussner

+0

偉大的問題。我已經在上面添加了它。我在做什麼確保它首先訂閱? – Scott

回答

1

訂閱是異步的。看起來您在數據到達客戶端之前正在創建模板。當您在控制檯中執行find時,客戶端已收到數據。

裏面你onCreated功能,你可以使用Tracker.autorun指定將被重新運行功能,當SourceElements收集的變化(這是所有的模板助手做幕後):

Tracker.autorun(function() { 
    var element = SourceElements.findOne({'_id': data.source_id}); 
    console.log(element); 
}); 

這個函數會被調用立即。此時,findOne可能會返回undefined,因爲訂閱尚未準備就緒。一旦數據到達,函數將被再次調用,並且您可以處理返回的元素。