2017-10-15 5 views
0

私は以下の2つの公開方法を持っていますが、クライアント検索ページの公開方法の1つを購読すると、もう1つはインデックスページのために上書きされます。Meteor publishが別の公開を上書きする

サーバー

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

ようこそ!

あなたが見ている「オーバーライド」は、パブリッシュ/サブスクライブメカニズムの通常のメテオの動作に過ぎません。

お客様の"task.index"すべて ドキュメントをクライアントに送信します。

したがって、同じ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); 
} 

しかし、同様に、クライアント上の文書をフィルタリングするために、常にことをお勧めします。

関連する問題