我有两种发布方法,如下所示,但是当我订阅客户端搜索页面中的一种发布方法时,它会被另一个用于索引页面的方法覆盖。
服务器
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")
有谁知道如何避免这种情况?
答案 0 :(得分:1)
欢迎来到SO!
很有可能"覆盖"你看到的只是发布/订阅机制的正常Meteor行为。
您的"task.index"
出版物将所有您的TaskCollection
文件发送给客户。
因此,TaskCollection
上的任何其他出版物都会发送客户已经知道的文件。
然后在您的客户端中,从您的订阅和发布过滤来自TaskCollection
的某些文档独立。只需执行TaskCollection.find({ state: state })
客户端,您就可以获得所需的文件。
当您只发布Collection的一部分文档时,您发布的内容正好已经是您希望在客户端上显示的已过滤文档,因此您只需显示在客户端上您知道的所有收藏文件。但你必须明白这些是两个不同的步骤:
答案 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);
}
但是,总是建议过滤客户端上的文档。