2017-02-16 45 views
1

對不起,Meteor框架的新手!如何控制兩個訂閱在單個模板中顯示?

我訂閱了兩個發佈函數。即使兩個發佈函數都針對相同的集合,它們都具有不同的功能,我希望在一個模板中顯示。我如何做到這一點。我已經做了大量的研究,但似乎沒有足夠的信息來說明如何實現。

下面是兩個在發佈代碼的功能,我訂閱:

.server/main.js:

Meteor.publish('MerchantTrending', function (categoryMan){ 
var currentUser = this.userId; 

return buyList.find({ who:"Merchant", ownerId:currentUser, itemCategory: { $in: categoryMan } }, {skip: 0, limit: 3}); 

}); 

.server/main.js:

Meteor.publish('myTopViews', function(){ 

var currentUser = this.userId; 
return buyList.find({ newArrivalsExpiryDate : {'$lte': new Date()}}, {ownerId:currentUser }, {skip: 0, limit: 3}); 
}); 

繼是代碼中的訂閱功能

。客戶端/ main.js:

Router.route('/MerchantLandingPage', {  
subscriptions: function(){ 
     var categoryMan = Session.get('category'); 

    return Meteor.subscribe('MerchantTrending', categoryMan, 'merchantTopViews') 

} 
}); 

現在在代碼輔助功能:

Template.MerchantLandingPage.helpers({ 

    'top3Trending' : function() {  
    return buyList.find({}).fetch(); 
    }, 

'myTopViews' : function() { 

    return buyList.find({}).fetch(); 
    } 
});  

而現在的模板代碼:

<template name="MerchantLandingPage"> 

##### *** Top three trending items *** ######## 

{{#each top3Trending}} 

ItemName:: <b>{{itemName}}</b> <br> 
Item Category:: <b>{{itemCategory}}</b> <br>     
Discription:: <b>{{descriptions}}</b> <br> 
Image:: {{this.photo._id}} <br> 
Date Created:: {{createdDate}} <br> 

{{/each}} 

<br><br> 

############ *** My top Views *** ############# 

{{#each myTopViews}} 

ItemName:: <b>{{itemName}}</b> <br> 
Item Category:: <b>{{itemCategory}}</b> <br>     
Discription:: <b>{{descriptions}}</b> <br> 
Image:: {{this.photo._id}} <br> 
Date Created:: {{createdDate}} <br> 

{{/each}} 

</template> 

兩個{{#each myTopViews}}和{{#each top3Trending}}成功顯示,但不正確。當

Meteor.subscribe變量categoryMan( 'MerchantTrending',categoryMan, 'merchantTopViews')

變化值,它影響雙方都{{#each myTopViews}}{{#each top3Trending}},結果當它應該只是一個影響{{#each top3Trending}}

我如何獲得訂閱,不會影響{{#each myTopViews}}{{#each top3Trending}},但只有{{#each myTopViews}}在我的模板中?

感謝您的幫助!

+0

怎麼樣從服務器發佈帶有必要字段的集合,並在客戶端應用選擇器? –

回答

0

歡迎來到流星!

的解決方案是直接的,一旦你明白:

  1. 認購距離服務器的數據庫文件的流進你的客戶的MiniMongoDB。因此,您的2個訂閱(在同一個收藏集上有幾個潛在客戶完全沒問題)只需填寫您的客戶的本地收藏集buyList即可。

  2. 使用集合客戶端通常與您如何訂閱數據無關。所以你應該簡單地使用top3TrendingmyTopViews助手中的一個類似的選擇器和可能的選項,就像你在發佈服務器端所做的那樣(顯然,這兩個助手之間並不相同)。

作爲一個側面說明,你甚至都不需要fetch()find()返回的集合光標,火焰知道如何直接處理它。

+0

關於你的第一點,在我的情況下,當發送變量'categoryMan'時,我對'MerchantTrending'的訂閱混淆了返回的遊標。讓我解釋。 'categoryMan'是一個動態數組關懷信息,從html表單中的checked/unchecked框中生成。返回的遊標取決於html表單中選中的複選框。我希望模板中的「top3Trending」部分能夠響應已選中/未選中的框,而不是「top3Trending」和「myTopViews」。我不太瞭解你的第二點。凱蒂澄清。 – SirBT

+0

也許你應該先做更多的教程,你聽起來會試圖在同一時間管理太多的複雜性。忘記Pub/Sub(現在),並嘗試使用客戶端代碼顯示您需要的內容。 – ghybs

0

我看到你的代碼的一些問題,首先 - 你的第二個訂閱行不通的,因爲你的查詢是錯誤的:

Meteor.publish('myTopViews', function(){ 

    var currentUser = this.userId; 
    return buyList.find(
     { ownerId:currentUser, newArrivalsExpiryDate : {'$lte': new Date()}}, 
     {skip: 0, limit: 3} 
    ); 
}); 

你有ownerId: currentUser包裹在花括號,這是固定的以上。

發佈/預訂工作的方式是,如果您有兩個發佈發送不同的數據,則模板不會'知道'數據來自兩個不同的訂閱。它將只能訪問所有訂閱發送的所有數據。

因此,您的兩名幫手top3trendingmyTopViews返回的是完全相同的東西。你可以刪除其中的一個!

您應該將您的訂閱移出路由器並進入模板本身。 Here's an article that will help you with that!

+0

感謝您澄清我的模板中發生了什麼,具體說明模板未能注意到信息是如何來自兩個不同的訂閱,並因此組合信息。將訂閱從路由器移動到模板本身並沒有什麼不同,因爲請記住Meteor.subscribe('MerchantTrending',categoryMan,'merchantTopViews')接受一個變量來更改爲這兩個訂閱返回的數據。 – SirBT

+0

@perusopersonale爲了進一步澄清,這裏的主要罪魁禍首是'MerchantTrending'訂閱,因爲它會將出版物發送'categoryMan'變量。這個變量的形式是一個數組。該數組根據選中的複選框值攜帶信息。這會影響遊標響應,使其變得動態。我需要弄清楚如何分隔模板中每個訂閱的光標。這可能嗎? – SirBT

0

有一個包percolate:find-from-publication允許過濾來自出版物的數據。

+0

謝謝。但是要麼沒有足夠的信息來說明如何使用這個軟件包,或者它無法解決我的問題。只是爲了進一步澄清,這裏的主要罪魁禍首是'MerchantTrending'訂閱,因爲它會將出版物發送'categoryMan'變量。這個變量的形式是一個數組。該數組根據選中的複選框值攜帶信息。這會影響遊標響應,使其變得動態。我需要弄清楚如何分隔模板中每個訂閱的光標。這可能嗎? – SirBT

相關問題