2017-02-16 17 views
1

Извините, новый для рамки Meteor!Как управлять двумя подписками для отображения внутри одного шаблона?

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

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

.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}} успешно отображаются, но не правильно. Когда в

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. Использование клиентской стороны Collections обычно не зависит от того, как вы подписываете данные. Поэтому вы должны просто использовать аналогичный селектор и, возможно, варианты в своих помощниках top3Trending и myTopViews, как это было сделано для вашей серверной части публикации (не то же самое между двумя помощниками, очевидно).

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

+0

Что касается вашего первого пункта, в моем случае моя подписка на 'MerchantTrending' при отправке переменной' categoryMan' помещает возвращаемый курсор. Позволь мне объяснить. 'categoryMan' - это динамический массив, который хранит информацию, полученную из проверочных/непроверенных полей в форме html. Возвращаемый курсор зависит от отмеченных флажков в форме 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 обернуты в фигурных скобках, то неподвижный выше.

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

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

Вы должны перенести свои подписки из маршрутизатора и в сам шаблон. 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