2016-08-16 3 views
0

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

Для примера - у меня есть одна страница с двумя различными шаблона:

1) список Тема

2) Популярные темы.

У меня есть два разные Meteor.publish и подписки на это.

1) В шаблоне списка тем я отсортировал по CreatedAt-field.

Meteor.subscribe('topics'); 

    Template.topics_main.helpers({ 
     topics:function(){ 
      return Topic.find({},{sort: {createdAt: -1}}); 
     } 
    }); 

2) В популярном списке я сортирую данные по рейтингу-поле.

Meteor.subscribe('popularTopics'); 
    Template.top_topics.helpers({ 
      topics:function(){ 
       return Topic.find({}, { 
      sort: { 
       views: -1 
      }, 
      limit: 5 
     }); 

    } 
}); 

И когда я прокручу список тем, я получу данные из популярных тем. Это не хорошо :) Как я могу изолировать данные, используя два шаблона с разными подписками, но один тип коллекций?

ответ

0

observeChanges может быть то, что вам нужно. Он позволяет публиковать ваши документы в определенной коллекции, чтобы вы могли опубликовать ваши две публикации (topics и popularTopics), захватывая данные из той же коллекции на сервере (Topics), но отправляя ее в разные коллекции на клиенте (например, Topics и PopularTopics).

Вот пример:

// globally somewhere 
const Topics = new Mongo.Collection('topics'); 
const PopularTopics = new Mongo.Collection('populartopics'); 

Добавить свои публикации, с observeChanges отправки опубликованных документов в двух различных коллекции на клиенте:

// topics.publications.js 
const abstractPublish = function (collectionName, query) { 
    const cursor = Topics.find(query); 

    const cursorHandle = cursor.observeChanges({ 
    added(id, fields) { 
     this.added(collectionName, id, fields); 
    }, 
    changed(id, fields) { 
     this.changed(collectionName, id, fields); 
    }, 
    removed(id) { 
     this.removed(collectionName, id); 
    } 
    }); 

    this.onStop(()=>{ 
    if (cursorHandle) cursorHandle.stop(); 
    }); 

    this.ready(); 
}; 

Meteor.publish('topics', function() { 
    // set up a publication to the "topics" collection 
    abstractPublish.call(this, 'topics', {}); 
}); 

Meteor.publish('popularTopics', function() { 
    // set up a publication to the "populartopics" collection 
    abstractPublish.call(this, 'populartopics', {popular: true}); 
}); 

Затем установите подписки шаблона уровня:

// topics_main.js 
Template.topics_main.onCreated(function() { 
    this.autorun(() => { 
    this.subscribe('topics', function() { 
     Topics.find().fetch(); // returns all topics 
    ); 
    }); 
}); 

И в вашем шаблоне популярных тем:

// top_topics.js 
Template.top_topics.onCreated(function() { 
    this.autorun(() => { 
    this.subscribe('popularTopics', function() { 
     PopularTopics.find().fetch(); // returns only topics that have {popular: true} 
    ); 
    }); 
}); 
+0

Спасибо за отличный ответ! Проблема в этом случае его мой ORM :) Я использую астрономию.Это будет немного сложнее использовать ваш метод через астрономию :) Но это решение выглядит довольно хорошо :) Действительно, у Meteor нет изоляции решений на уровне шаблона? –

+0

Если вы не можете одновременно просмотреть оба шаблона (например, если они находятся на разных страницах вашего приложения), то использование подписки на уровне шаблона должно быть достаточно хорошим. Поскольку при рендеринге top_topics Topic содержит только популярные темы, то когда этот шаблон уничтожается, подписка прекращается и документы удаляются с клиента. Затем вы можете отображать topic_main, и Тема будет заполнена всеми документами (популярными и непопулярными). – carlevans719

+0

Да, я знаю о разных страницах :) Проблема в том, что они хранятся на одной странице. И, я просто пытаюсь найти правильный путь, без хакса. Таким образом, его вид невозможен без взлома) Полная проблема с изображениями: https://forums.meteor.com/t/how-can-we-isolate-subscribtions-data/28062/3 –

0

Это известное ограничение текущей модели публикации Метеор.

Некоторые варианты, которые приходят на ум, чтобы преодолеть это:

  1. Найти способ дифференцировать данные, используя более рафинированный запрос.
  2. Извлеките некоторые данные другим способом (например, используя метод, не используя pub/sub или коллекции).
  3. Публикация в «виртуальную» коллекцию (путем ручного контроля курсора в публикации).

Apollo Stack также может быть удобно.

+0

Благодарим за внимание! –

Смежные вопросы