Meteor publish overwrites another publish

不想你离开。 提交于 2020-01-17 08:37:28

问题


I have two publish method as below but when I subscribe to one of the publish method in client search page, it is being overwritten with the other one which is meant for index page.

Server

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

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

Client - search page

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

Client - index page

Meteor.subscribe("task.index")

Does anyone know how to avoid this?


回答1:


Welcome to SO!

There is a high chance the "override" you see is just the normal Meteor behaviour for Publish/Subscribe mechanism.

Your "task.index" publication sends all your TaskCollection documents to the Client.

Therefore any other publication on that same TaskCollection will send documents that the Client already knows.

Then in your Client, filtering some documents from TaskCollection is independent from your subscription and publication. Just perform your TaskCollection.find({ state: state }) Client side, and you will get the documents you need.

When you publish only a subset of documents of a Collection, it happens that what you publish is exactly already the filtered documents that you want to display on your Client, therefore on your Client you just display all Collection documents you know of. But you have to understand that these are 2 different steps:

  1. Subscription to send some documents to the Client. Several Subscriptions may be set, filling the same Collection on the Client.
  2. Filtering on the Client, based on the documents sent by the (possibly several) Subscription(s).

See also: Publish subscribe doesn't seem to work




回答2:


If your client index and search pages are different templates, you can subscribe to the documents at respective template level.

Client - search page:

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); 
}

Client - index page:

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

But, it is always advisable to filter the documents on the client as well.



来源:https://stackoverflow.com/questions/46754845/meteor-publish-overwrites-another-publish

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!