2017-10-15 98 views
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") 

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

回答

1

欢迎来到SO!

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

您的"task.index"发布将全部您的TaskCollection文件发送给客户。

因此,在同一TaskCollection上的任何其他出版物都将发送客户端已知的文档。

然后在您的客户端,从TaskCollection筛选一些文档是独立从您的订阅和发布。只需执行你的TaskCollection.find({ state: state })客户端,你将得到你需要的文件。

当你只发布的文档集合的子集,它发生,你发布的内容是正是已经要显示在您的客户端过滤的文件,因此你的客户,你只是显示所有托收你了解。但你必须明白,这些是2个不同的步骤:

  1. 订阅将一些文件发送到客户端。可以设置多个订阅,在客户端上填写相同的集合。
  2. 根据(可能几个)订阅所发送的文档在客户端进行过滤。

参见:Publish subscribe doesn't seem to work

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

但是,它始终是最好筛选客户机上的文件,以及。