Meteor发布会覆盖另一个发布

时间:2017-10-15 12:06:20

标签: meteor meteor-publications

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

服务器

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 个答案:

答案 0 :(得分:1)

欢迎来到SO!

很有可能"覆盖"你看到的只是发布/订阅机制的正常Meteor行为。

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

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

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

当您只发布Collection的一部分文档时,您发布的内容正好已经是您希望在客户端上显示的已过滤文档,因此您只需显示在客户端上您知道的所有收藏文件。但你必须明白这些是两个不同的步骤:

  1. 订阅以向客户发送一些文件。可以设置多个订阅,在客户端填写相同的集合。
  2. 根据(可能是几个)订阅发送的文件过滤客户。
  3. 另请参阅:Publish subscribe doesn't seem to work

答案 1 :(得分: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); 
}

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