2017-10-15 64 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); 
} 

但是,它始終是最好篩選客戶機上的文件,以及。