2012-04-16 62 views
2

基本上,我只是試圖渲染一個模板,其中包含由MongoDB find()調用返回的文檔的result屬性。我有自動訂閱。帶有集合中文檔的流星 - 呈現模板

我有一個HTML模板

<template name="results"> 
    status: {{result}} 
</template> 

而且我想使其在js文件:

if (Meteor.is_client) { 
    Template.results.result = function() { 
     return Results.find({'type': 'test'}).fetch()[0].result; 
    } 
} 

有一個在蒙戈{type: "test", result: "success"}的記錄。代碼一直拋出一個錯誤,「未定義沒有屬性結果」。但是,當我只返回Results.find({'type': 'test'}).fetch()[0]它實際上返回一個對象,而不是未定義的(如果我將它記錄到控制檯,我可以看到它具有我設置的result屬性)。

我能想到的唯一的事情就是它可能與流星的反應行爲有關 - 也許MongoDB調用最初返回undefined,然後再更新以包含正確的文檔。那是對的嗎?如果是這樣,我怎樣才能得到該文件的result屬性的值?

回答

4

在服務器將結果中的文檔發送出去之前,只要客戶端啓動,就會立即呈現您的模板。試試這個(findOne是簡寫fetch()[0]):

Template.results.result = function() { 
    var obj = Results.findOne({'type' : 'test'}); 
    return obj && obj.result; 
} 
+0

如果你的findOne是一個方法的內部和Template.this.that被調用方法。該方法也被其他代碼調用,而不是面向模板的,並且在返回obj && obj.result時出錯。你如何處理這種情況?我遇到了這個問題,如果我不需要,我不想打開另一個線程。 – 2012-05-26 00:41:30

+0

這是什麼用例?模板可能不應該是調用方法。只要屏幕重新繪製,您就可以往返於服務器。流星的方法是訂閱驅動模板的數據,以便屏幕繪製補償該往返行程的延遲。 – debergalis 2012-05-26 01:21:13

+0

忽略,不得不編輯這個,回答錯誤。我會嘗試。但是我想要做的是減少代碼的重複。 Template.this.that = function(){var obj = myObject.myMethodGetData(Session.get(「search_value」));返回obj; };允許其他代碼調用myObject.myMethodGetData以獲取該數據。 – 2012-05-26 09:26:16