如何控制两个订阅以在单个模板中显示?

时间:2017-02-16 12:17:31

标签: meteor publish-subscribe spacebars

对不起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});
});

以下是代码

中的订阅功能

.client / 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}}都成功显示但未正确显示。当变量categoryMan

Meteor.subscribe(&#39; MerchantTrending&#39;,categoryMan,&#39; merchantTopViews&#39;)

更改值,它会同时影响{{#each myTopViews}}{{#each top3Trending}}的结果,只会影响{{#each top3Trending}}

如何才能让订阅对{{#each myTopViews}}{{#each top3Trending}}产生影响,但我的模板中只有{{#each myTopViews}}

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

欢迎来到流星!

一旦你理解了解决方案,就可以直接解决:

  1. 订阅只是从服务器到客户端的MiniMongoDB的数据库文档流。所以你的2个订阅(在同一个Collection上有几个潜艇完全没问题)只需填写你客户的buyList本地收藏。

  2. 使用集合客户端通常与订阅数据的方式无关。因此,您应该像在发布服务器端那样使用类似的选择器以及top3TrendingmyTopViews帮助程序中可能的选项(显然,在2个帮助程序之间不一样)。

  3. 作为旁注,您甚至不需要fetch()find()返回的Collection光标,Blaze知道如何直接处理它。

答案 1 :(得分:0)

我发现您的代码存在一些问题,首先 - 您的第二个订阅无效,因为您的查询错误:

CREATE TABLE tblTempTestTableStack

(DataColumn1 DATETIME, DataColumn2 DATETIME)

INSERT INTO tblTempTestTableStack

SELECT SUBSTRING('2017-02-01 12:44:15.160   ||  2017-02-01 23:44:15.160', 1, 23)
            , SUBSTRING('2017-02-01 12:44:15.160   ||  2017-02-01 23:44:15.160', 30, 23)

UNION ALL

SELECT SUBSTRING('2017-02-01 13:44:15.160   ||  2017-02-03 02:44:15.160', 1, 23)
            , SUBSTRING('2017-02-01 13:44:15.160   ||  2017-02-03 02:44:15.160', 30, 23)


SELECT CAST(CONVERT(DATE, DataColumn1) AS VARCHAR(10)) + ' ' + 
        RIGHT('00' + CAST(DATEPART(HH, DataColumn1) AS VARCHAR(2)), 2) + ':00:00' + '   ||  '
        + CAST(CONVERT(DATE, DataColumn2) AS VARCHAR(10)) + ' ' + 
        RIGHT('00' + CAST(DATEPART(HH, DataColumn2) AS VARCHAR(2)), 2) + ':00:00'


FROM tblTempTestTableStack

你有Meteor.publish('myTopViews', function (){ var currentUser = this.userId; return buyList.find( { ownerId:currentUser, newArrivalsExpiryDate : {'$lte': new Date()}}, {skip: 0, limit: 3} ); }); 用花括号包裹,它固定在上面。

发布/订阅的工作方式是,如果您有两个发布不同数据的发布,则模板不会“知道”数据来自两个不同的订阅。它只能访问所有订阅发送的所有数据。

出于这个原因,你的两位助手ownerId: currentUsertop3trending正在返回完全相同的东西。你可以删除其中一个!

您应该将订阅移出路由器并移至模板本身。 Here's an article that will help you with that!

答案 2 :(得分:0)

有一个包percolate:find-from-publication允许过滤出版物中的数据。