0

我有如下两种发布方法,但是当我订阅客户端搜索页面中的一种发布方法时,它被另一个用于索引页面的方法覆盖。

服务器

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")

有谁知道如何避免这种情况?

4

2 回答 2

1

欢迎来到 SO!

您看到的“覆盖”很可能只是发布/订阅机制的正常 Meteor 行为。

您的"task.index"出版物会将您的所有TaskCollection文件发送给客户。

因此,任何其他出版物TaskCollection都将发送客户已经知道的文档。

TaskCollection然后在您的客户端中,从中过滤一些文档独立于您的订阅和发布。只需执行您的TaskCollection.find({ state: state })客户端,您将获得所需的文件。

当您仅发布集合的文档子集时,您发布的内容恰好已经是您想要在客户端上显示的过滤文档,因此在您的客户端上您只显示您知道的所有集合文档。但是您必须了解这是两个不同的步骤:

  1. 订阅将一些文件发送给客户。可以设置多个订阅,填充客户端上的同一个集合。
  2. 根据(可能是多个)订阅发送的文档对客户端进行过滤。

另请参阅:发布订阅似乎不起作用

于 2017-10-15T12:36:58.190 回答
0

如果您的客户索引和搜索页面是不同的模板,您可以订阅相应模板级别的文档。

客户端 - 搜索页面:

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

但是,始终建议过滤客户端上的文档。

于 2017-10-16T03:01:27.773 回答