1

異なるルートに基づいて、同じコレクションのサブセットを公開および購読したいと考えています。これが私が持っているものです

/server/publish.js 内

Meteor.publish("questions", function() {
  return Questions.find({});
});

Meteor.publish("questionSummaryByUser", function(userId) {
  var q = Questions.find({userId : userId});  
  return q;
});

/client/main.js 内

Deps.autorun(function() {
  Meteor.subscribe("questions");
});
Deps.autorun(function () {
  Meteor.subscribe("questionSummaryByUser", Session.get("selectedUserId"));
});

ルーター パッケージ ( https://github.com/tmeasday/meteor-router ) を使用しています。アプリを機能させたいのは、「/questions」に移動したときに、すべてのユーザーによるすべての質問を一覧表示したいのと、「/users/:user_id/questions」にアクセスしたときに、特定の質問のみを一覧表示したい場合です。ユーザー。このために、「/users/:user_id/questions」ルートをセットアップして、「selectedUserId」セッションでユーザー ID を設定しました (「questionSummaryByUser」公開メソッドでも使用しています)。

ただし、「/users/:user_id/questions」で質問のリストを見ると、user_id に関係なくすべての質問が表示されます。

コレクションがクライアント側でマージされていることをここで読みましたが、上記のシナリオの解決策はまだわかりませんでした。

私はMeteorを始めたばかりなので、その内外を知らないことに注意してください.

前もって感謝します。

4

1 に答える 1

2

サブスクライブによって取得したサブセットに依存するのではなく、使用する場所でコレクション データをフィルタリングすることをお勧めします。そうすれば、同じコレクションにさらにサブスクリプションを追加した場合でも、取得したデータが表示したいものと同じであることを確認できます。たとえば、すべてのユーザーからの上位 10 件の質問を含むサイドバーなどを後で表示したい場合を想像してみてください。次に、それらもフェッチする必要があり、サブスクライブされたすべてのデータを表示する場所がある場合、すべての関数が混乱します。

したがって、ユーザーの質問を表示するテンプレートで、次のようにします。

Template.mine.questions = function() {
    return Questions.find({userId: Meteor.userId()});
};

questionSummaryByUserそうすれば、別のチャンネルも必要ありません。

 


 

サブスクリプションのデータをフィルター処理するには、いくつかのオプションがあります。どちらを選択しても、サブスクリプションは表示するデータを選択する場所ではないことに注意してください。これは常に上記のようにフィルタリングする必要があります。

オプション1

すべてを単一のパラメータ化されたチャネルに保持します。

Meteor.publish('questions', function(options) {
  if(options.filterByUser) {
    return Questions.find({userId: options.userId});
  } else {
    return Questions.find({});
  }
});

オプション 2

すべてのチャネルが必要な場合にのみデータを返すようにします。

Meteor.publish('allQuestions', function(necessary) {
  if(!necessary) return [];
  return Questions.find({});
});

Meteor.publish('questionSummaryByUser', function(userId) {
  return Questions.find({userId : userId});  
}); 

オプション 3

クライアントでサブスクリプションを手動でオフにします。この場合、これはおそらくやり過ぎであり、不必要な作業が必要になります。

var allQuestionsHandle = Meteor.subscribe('allQuestions');

...

allQuestionsHandle.stop();
于 2013-07-26T14:02:36.803 に答える