Метеоритная публикация перезаписывает другую публикацию

У меня есть два метода публикации, как показано ниже, но когда я подписываюсь на один из методов публикации на странице поиска клиента, он перезаписывается другим, предназначенным для индексной страницы.

сервер

Meteor.publish("task.index", function() {
  TaskCollection.find()
}

Meteor.publish("task.index.search", function(state) {
  TaskCollection.find({ state: state })
}

Клиент - страница поиска

Meteor.subscribe("task.index.search", state)
// this will always be overwritten with "task.index" published collection

Клиент - индексная страница

Meteor.subscribe("task.index")

Кто-нибудь знает, как этого избежать?

2 ответа

Решение

Добро пожаловать на ТАК!

Существует высокая вероятность того, что "переопределение", которое вы видите, является просто нормальным поведением Метеора для механизма публикации / подписки.

Ваш "task.index" публикация отправляет все ваши TaskCollection документы для клиента.

Поэтому любая другая публикация о том же TaskCollection отправит документы, которые Клиент уже знает.

Затем в вашем клиенте, фильтруя некоторые документы из TaskCollection не зависит от вашей подписки и публикации. Просто выполни TaskCollection.find({ state: state }) Клиентская сторона, и вы получите необходимые документы.

Когда вы публикуете только подмножество документов Коллекции, то, что вы публикуете, это точно уже отфильтрованные документы, которые вы хотите отобразить на своем Клиенте, поэтому на вашем Клиенте вы просто отображаете все известные вам документы Коллекции. Но вы должны понимать, что это 2 разных шага:

  1. Подписка для отправки некоторых документов Клиенту. Можно установить несколько Подписок, заполняя одну и ту же Коллекцию на Клиенте.
  2. Фильтрация на Клиенте, основанная на документах, отправленных (возможно несколькими) Подпиской (ями).

Читайте также: публикация подписки не работает

Если ваш клиентский индекс и страницы поиска - это разные шаблоны, вы можете подписаться на документы на соответствующем уровне шаблонов.

Клиент - страница поиска:

Template.search.created = function () {
    const template = this;
    template.subscribe('task.index.search', state);
}
Template.search.rendered = function () {
    console.log("Client search : " + TaskCollection.find().fetch().length); 
}

Клиент - индексная страница:

Template.index.created = function () {
    const template = this;
    template.subscribe('task.index');
}
Template.index.rendered = function () {
    console.log(""Index : " + TaskCollection.find().fetch().length); 
}

Но всегда желательно фильтровать документы и на клиенте.

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