2012-12-18 87 views
9

我在嘗試從流星集合中獲取數據時遇到了一些問題,我需要一些建議。從流星集合中檢索數據

該集合已被成功定義,發佈和訂閱。如果我將數據發送到一個模板,它顯示罰款:

Template.Lists.Projects = function(){ 
    return Projects.find(); 
}; 

但我試圖顯示它之前使用的數據,這是我遇到的問題。首先,我發現find()和findOne()之間存在一些不一致。 find(selector)工作正常並返回一個遊標,但findOne(selector)返回「undefined」。我真的只是在尋找1個條目,所以find()似乎沒有必要。

返回LocalCollection.Cursor:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
console.log(find); 

,則返回undefined:在LocalCollection.Cursor使用.fetch()時

var find = Projects.findOne({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
console.log(find); 

我的下一個問題出現了。它返回一個空數組。

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
var fetch = find.fetch(); 
console.log(fetch); 

這所有返回的是下面的行:

[]

當我嘗試指定從陣列我想顯示,像一個特定的鍵:

var find = Projects.find({_id: "3fd33eed-9735-4376-860e-3be383beae2f"}); 
var fetch = find.fetch(); 
console.log(fetch.name); 

它返回undefined。

我仍然熟悉Meteor,從未使用MongoDB(或minimongo),所以我可能只是犯了一些愚蠢的錯誤。如果任何人都可以向我指出,我會很高興!

+0

你想在顯示數據之前使用數據,你可以使用template.templateName.rendered來做到這一點,如果渲染是在每個模板中,模板代表數據本身,就像你可以使用「this」 ,它只是你的文件。我會舉一個例子來證明。 – crapthings

回答

0

如果你已經刪除自動發佈,如果你發佈集合給所有用戶而不使用發佈名稱?

Meteor.publish null, -> 
    Products.find {} 

你在哪裏訂閱你的收藏?

模板幫手

Handlebars.registerHelp = 'products', (id) -> 
    Product.find _id: Session.get 'productId' 

一樣,如果我們有價格在每一件產品。 模板部分看起來像......

<template name="products-list"> 
    <div class="products-list"> 
     {{#each products}} 
      {{> product-item}} 
     {{/each}} 
    </div> 
</template> 

<template name="product-item"> 
    <div class="product-item"> 
     {{price}} 
    </div> 
</template> 

JS部分,我將使用CoffeeScript的...

Template['product-item'].price = -> 
    console.log @ # @ is this as it is product itself, if we have product inserted. 
    console.log this 
    return 'the price is: ' + @price 
+0

我已經自動發佈並已成功發佈,由服務器發佈,由客戶端訂閱,並呈現在模板中。我真的不確定你放的代碼是什麼(部分是因爲我使用JavaScript,而不是CoffeeScript),但我認爲它不能解決我的問題。我只想將特定條目的鍵分配給變量,以便在將它們呈現在模板中之前對它們進行操作。 –

+0

不能真正理解你在做什麼,但你曾經說過「但是我試圖在顯示它之前使用這些數據」,所以我認爲你可以在模板呈現之前操作數值。 – crapthings

+5

如果OP使用javascript,我認爲最好還是在javascript中編寫答案,因爲正如你所看到的,你可能冒險發佈一個OP實際上無法理解的答案!出於這個原因,我已經低估了這個答案。 – Rahul

4

您的查找結果()和findOne()是一致的。基本上,Mongo或minimongo根本找不到與_id匹配的文檔。 FindOne()就像做一個查找(選擇器,選項).fetch()[0]。

您的Lists.Projects模板可能期望它可以迭代的集合,數組或散列。你不能返回一個特定的文件。如果您使用的是{{#each Projects}},則必須爲模板提供一些方法來迭代不只一個值。

1

我最近有同樣的問題, 從query.observe使用時,集合find()沒有返回任何內容。

問題是收集的subscribe的順序。

例如,如果你有一個名爲Lists和一個叫Projects收集,

如果你通過觀察名單查詢獲得的項目,你有:

Meteor.subscribe('Lists'); 
Meteor.subscribe('Projects'); 

會發生什麼事是查詢觀察觸發器被調用,但項目尚未從服務器獲取。所以Projects.find()。取()。長度= 0

爲了解決這個問題,根本就

Meteor.subscribe('Projects');  
Meteor.subscribe('Lists'); 
0

嘗試這種方式

Meteor.subscribe('testData', function() { 
    var document = Documents.find(); 
    console.log(document); 
}); 
0

您在客戶端上工作,你永遠不知道客戶端何時獲得了您需要的所有數據。您的功能可以在集合爲空或尚未完成同步時觸發。因此,您必須向您的minimongo發出延遲請求(當所有數據都可在本地獲得時)

是的,當您的DOM未通過getElementById()或其他東西呈現時,您無法訪問其他東西,但在您嘗試訪問來自minimongo的數據(您瀏覽器中的本地mongodb版本)不是DOM,因此您的模板在這裏並不重要。

只需等到您的訂閱準備就緒,您的minimongo就可以在訂閱呼叫中擁有onReady回撥的所有數據並激活您的功能。

https://docs.meteor.com/api/pubsub.html#Meteor-subscribe

回調(功能或對象)。

可選。可能包括onStoponReady 回調。如果有錯誤,它將作爲參數傳遞給onStop的 。如果傳遞函數而不是對象,則將其解釋爲onReady回調。