2013-08-02 57 views
1

所以我想訂閱一個發佈函數,它只返回一個集合的一個對象。流星:發佈函數返回整個集合而不是一個對象

Meteor.publish("singleobject", function(bar) { 
    return MyCollection.find({foo: bar}); 
}); 

這應該給我集合「MyCollection」的單一對象,其中foo屬性等於「bar」,對吧? (只有一個對象,這是真的...所以findOne()也應該工作)。它所做的卻是將我收藏的所有物品返還給我,甚至是那些foo不等於酒吧的物品。

它適用於另一個集合,其中有多個對象,其中foo:「bar」爲真。 我真的不明白我在做什麼錯。我是否可以不訂閱僅返回一個對象的發佈函數?

任何人有任何想法呢? :-)

問候 帕特里克

回答

0

所以......不要把

Meteor.subscribe() 

Meteor.autorun() 

Deps.autorun() 

內。 Meteor.autorun()/ Deps.autorun()中的所有東西都會被執行,即使它在模板特定的.js文件中。我認爲這些js文件中的每一個都只在加載相應的模板時加載,這當然是完全錯誤的。 這僅用於正確構建您的應用程序。

所以,如果你想訂閱根據加載該模板的發佈功能,把Meteor.subscribe進入路由器回調函數和訂閱那裏。

現在完美適合我! :)

3

你使用的代碼:

Meteor.publish("singleobject", function(bar) { 
    return MyCollection.find({foo: bar}); 
}); 

並不只返回一個對象,但對象具有foo等於bar。如果你只想要一個(不管是哪一個),你應該使用findOne代替:

Meteor.publish("singleobject", function(bar) { 
    return MyCollection.findOne({foo: bar}); 
}); 

如果您也看到,有foo !== bar的對象,這意味着你在其他地方獲取它們。有兩種可能的解釋:

  • 您有另一種方法公佈在同一個集合,或
  • 你仍然有autopublish包。

照顧這兩件事,你應該沒問題。

 


 

對於訂閱,這是通常的模式:

Deps.autorun(function(){ 
    Meteor.subscribe('channel'); 
}); 

 


 

如果您希望訂閱只能不時工作,那麼實現它的方法很少。

最簡單的方法是向訂閱添加一個布爾參數,並且只有在您要使用該通道時纔將其設置爲true。在發佈方法中,如果標誌爲false,則只需返回null

更清晰的方法是跟蹤所有訂閱句柄,並在當前不想使用的那些句柄上呼叫stop()。這很好,但很難推薦這個版本的Meteor,因爲一切都必須手動完成,這增加了一些不是真正必要的工作。

+1

+1 @HubertOG目前有1337的聲望,所以你一定要聽他的。 –

+0

謝謝@HubertOG!所以問題在於我在Meteor.autorun()中訂閱了我的訂閱,而現在我認爲這是不正確的。所以......試圖把訂閱功能Template.templatename.created =函數(){}內部的,但由於某種原因,還是不對。 通過標準的href鏈接切換到另一個頁面( - >加載另一個模板)之前,模板的舊訂閱仍然完好無損。那麼,如果我希望它們是特定於模板的,我會在哪裏放置訂閱? ()' –

+0

幾個流星版本前'Meteor.autorun()'用'Deps.autorun替換 - 看到更新後的答案。 –

相關問題