2016-02-18 36 views
1

我正在構建的應用程序有一個遊戲集合。這個集合中的每個對象都有大量的數據與它相關聯。在爲每個用戶列出遊戲時,我必須限制發送給它的字段。這是所有常見的東西,工作正常。問題出現在我想要獲得更多特定遊戲領域的時候,例如當我進入其頁面時,我需要的不僅僅是描述和名稱。使用流星的發佈 - 訂閱獲取更多字段爲minimongo對象

遊戲列表的發佈如下,後面是發佈我試圖用來更新所有字段的文檔。

Meteor.publish('games', function() { 
    return Games.find({owner: this.userId}, {fields: { 
     name: 1, 
     description: 1 
    }}); 
}); 

//Publish all the fields for the given game 
Meteor.publish('game', function(gameId) { 
    return Games.find({_id: gameId}); 
}); 

我的流星發佈訂閱功能的理解是,第二次發佈將更新遊戲minimongo集錦,讓新字段集合中的對象。

但是我的理解似乎有缺陷,或者我的實現有些問題是錯誤的。

當我在列表頁面上登錄遊戲集合console.log(Games)時,我訂閱「遊戲」發佈。我得到了我的預期,這是一個包含當前用戶擁有的所有遊戲的集合。所有文件只有預期的名稱和說明。

當我去遊戲頁面,在那裏我訂閱'遊戲'。該集合意外改變。當我做與上面相同的日誌時,我得到一個只有一個對象但擁有所有字段的集合。這不是我所期望的,但它適用於我所需要的。

問題出現在此之後。當我做客戶端選擇(below)在minimongo colleciton。我得到一個只有描述和名稱的對象。

game:() => { 
    return Games.findOne({_id: $stateParams.gameId}); 
} 

我上有所有我想要的域對象的colleciton做一個尋找,卻選擇只返回對象有我預先定義的兩個領域。

我迷失在如何讓這個工作,以及我所面臨的問題是拋出我的理解流星窗外的發佈訂閱功能。

如果需要

任何意見或建議,試試我可以在瀏覽器控制檯添加集合對象的一些截圖?

編輯:這裏有兩個學家與我的角度compenets,顯示訂閱:

遊戲:https://gist.github.com/Jiig/f9577469d868a3165221

遊戲:https://gist.github.com/Jiig/70dce515581ce12beb6f

+0

你使用鐵路由器嗎? –

+0

@MichelFloyd不,在客戶端上使用帶角度的ui路由器。 – Jiig

+0

這一切都來自您正在訂閱的內容以及呈現了哪個模板(假設您正在'te​​mplate.onCreated'上訂閱)。您可以分享顯示訂閱的模板樣本嗎? – lucascurti

回答

1

您所描述的行爲似乎正常在我的方式:你」重新訂閱所有物品的集合,另一方面你訂閱一個子集,所以流星'魔法'在這裏對你不利。

有幾件事情可以做:

  • 訂閱只用一個遊戲網頁上同時訂閱:這將防止被清除的完整列表,因爲你不訂閱了它,它只會更新一個遊戲的所有字段。

  • 將集合拆分爲信息和泛型選項:這對我來說更麻煩,但我是一個選項。

  • 做一個方法調用來獲取一個遊戲的信息:一個小黑客,但應該工作。

我想你應該試試第一個選項,看看它是如何爲你執行的。無論如何,如果它是一個需要時間加載的長列表,你應該確保你保持訂閱完整的收藏。

祝你好運。

+0

謝謝。我嘗試了第一個建議,並且集合現在正在更新爲特定對象的字段,同時保留其他所有對象。但是,我的客戶端findOne仍然給我一個仍然只有名稱和說明字段的對象。 – Jiig

+0

如果你看到集合上的更新,那麼findOne應該重新審視那裏。你確定你沒有過濾你的請求中的其他字段嗎?如果findOne不起作用,請使用對象ID來查找find()。 – MrE

+0

使用查找工作,現在給我正確的對象,謝謝你的幫助。 – Jiig