2

単一のドキュメント内の特定の変更を購読するための正しいパターンを見つけようとしています。例は、私がやろうとしていることをよりよく強調します。たとえば、ブログ投稿用の Mongo ドキュメントがあり、このドキュメントにはコメントのリストが含まれているとします。現在、そのブログ投稿を見つけるためのクエリがあります: Posts.findOne("<id">)、これは私のテンプレートを反応的に更新します:

<template name="post">
    <h1>{{title}}</h1>
    {{#each comments}}
        {{> comment this}}
    {{/each}}
</template>

問題は、その投稿に関する何かが変更された場合 (通常は、コメント リストに追加されたコメント)、その投稿を表示しているすべてのユーザーが全体を更新することです。私はむしろ、1) フィールド固有のある種のリスナーをセットアップする、および/または 2) 「更新を投稿するときは、更新内容を確認し、変更内容に応じて何かを更新する (たとえば、更新のみ)」と言うために、少し手動でインターセプトを行います。更新されたコメント、または新しいレコードがあるように見える - 追加しましょう)".

この種のことはドキュメント レベルで実行可能であることは知っていますCollection.observe(たとえば、新しいドキュメントが出入りするたびに、何が変更されたかを細かく制御できます)。しかし、ドキュメント内ではどうでしょうか。現在のドキュメントをセッションに保存し、ドキュメントが更新され、リアクティブな検索コマンドによって通知されたら、新しいドキュメントと古いドキュメントを比較することでできると思いますが、それが最善の方法ですか? 明らかな何かが欠けていますか?

どんなガイダンスも大歓迎です!

4

1 に答える 1

0

私もMeteorを学んでおり(数週間経ちました)、あなたが説明したような問題がありました。現時点での私の提案は、アプリでPostsCommentsの2 つのコレクションをサブスクライブすることです。

コメントアイテムは次のようになります。

{
  _id : \\ Mongo によって自動生成された ID、
  text : 'これはコメントです',
  PostID : 'postUniqueID'
  ユーザー:「ユーザー名」
  //等。
}

クライアント側では、コメントサブスクリプションで、投稿の一意の ID をパラメーターとして渡します。サーバー側では、PostID = postUniqueIDのコメントのみを公開します。

重要:ユーザーが別のブログ投稿に切り替えるたびに変更されるように、Meteor.autorun() ブロックでコメントのサブスクリプションを設定する必要があります。

私の経験では、このアプローチにより、テンプレート化とコーディングがはるかに簡単になります。ただし、2 つのコレクション (1 つではなく) にサブスクライブすることが Meteor のパフォーマンスに顕著な影響を与えるかどうかは分析していません。

于 2013-02-23T02:37:03.573 に答える