Как управлять двумя подписками для отображения в одном шаблоне?

Извините, что-то новое в структуре Метеор!

Я подписался на две функции публикации. Даже если обе функции публикации предназначены для одной и той же коллекции, они обе имеют разные функции, которые я хотел бы отобразить в одном шаблоне. Как мне этого добиться. Я провел много исследований, но, похоже, нет достаточной информации о том, как этого добиться.

Ниже приведены две функции публикации в коде, на который я подписываюсь:

.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('MerchantTrending', категория Man, 'merchantTopViews')

меняет значение, это влияет как на результат обоих {{#each myTopViews}} а также {{#each top3Trending}}, когда его только должно повлиять {{#each top3Trending}},

Как я могу получить подписки, которые НЕ влияют на оба {{#each myTopViews}} а также {{#each top3Trending}}, но только {{#each myTopViews}} в моем шаблоне?

Спасибо за помощь!

3 ответа

Существует пакет percolate: поиск из публикации, который позволяет фильтровать данные из публикаций.

Добро пожаловать в Метеор!

Решение простое, если вы понимаете, что:

  1. Подписка - это просто поток ваших документов БД с сервера на MiniMongoDB вашего клиента. Таким образом, ваши 2 подписки (это прекрасно, если у вас несколько подписок в одной Коллекции) просто заполняют ваши клиенты. buyList местная коллекция.

  2. Использование клиентской части коллекций обычно не зависит от того, как вы подписываетесь на данные. Так что вы должны просто использовать подобный селектор и, возможно, опции в вашем top3Trending а также myTopViews помощники, как вы сделали для вашего сервера публикации (очевидно, не то же самое между 2 помощниками).

Как примечание стороны, вам даже не нужно fetch() курсор коллекции, возвращаемый find()Блейз знает, как справиться с этим напрямую.

Я вижу несколько проблем с вашим кодом, прежде всего - ваша вторая подписка не будет работать, потому что ваш запрос неправильный:

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

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

Ты имел ownerId: currentUser завернутый в фигурные скобки, он закреплен выше.

Работа публикаций / подписок заключается в том, что если две публикации отправляют разные данные, шаблон не "знает", что данные поступают из двух разных подписок. Он просто будет иметь доступ ко всем данным, отправляемым по всем подпискам.

По этой причине ваши два помощника top3trending а также myTopViews возвращаются точно так же. Вы можете удалить один из них!

Вы должны переместить свои подписки из роутера и в сам шаблон. Вот статья, которая поможет вам в этом!

Другие вопросы по тегам