web-dev-qa-db-ja.com

Meteorはfetchを使用しますか、それともテンプレートヘルパー関数で検索しますか?

流星テンプレートヘルパー関数内で、findfetchの結果を返した場合、パフォーマンス、再レンダリングの数、またはその他に違いはありますか?

たとえば、検索アプローチ:

Template.players.topScorers = function () {
  return Users.find({score: {$gt: 100}}, {sort: {score: -1}});
};

またはフェッチを追加します。

Template.players.topScorers = function () {
  return Users.find({score: {$gt: 100}}, {sort: {score: -1}}).fetch();
};

検索のみのアプローチは現在 docs にあるものですが、fetchを使用している他の多くの人々を見てきました。

24
MrColes

はいあります。

フェッチを使用すると、クエリ結果セット全体への依存関係をその場で登録できます。 findを使用し、後で{{#each}}を使用して反復することにより、依存関係がすべてのドキュメントに個別に登録されます。したがって、1つのドキュメントが変更されると、関連するコードのみが再レンダリングされます。 fetchを使用する場合、結果セット内のドキュメントを変更すると、fetchを使用したスコープ全体が再レンダリングされます。

小さな結果セットの場合、違いはありません。頻繁に変更される大きなセットの場合、計算が遅くなり、望ましくない視覚的なアーティファクトが発生する可能性があります。

私はそれを理解するのに役立つかもしれない 投稿 を書きました(それはあなたの質問に直接答えませんが)

48
Xyand

これは、OodlesTechnologiesで従うものです。

ヘルパーを定義するには、たとえばテンプレート名がallInventoryの場合、テンプレートjs​​ファイルに移動するだけなので、allInventory.jsファイルに移動して、ヘルパーを次のように記述します。

Template.allInventory.helpers({

})

このヘルパー内に、データベースやセッション、または他のサービスからデータを取得するためのロジックを配置し、それをhtmlで使用する関数を作成します。

    Template.allInventory.helpers({
        productDetails: function() {
              return Session.get('dbData');
        }
    })

On html side you just need to use the function name as follows:-

{{#each productInfo in productDetails}}

        <div class="imgb"><img src="{{productInfo.image_url}}"></div>
           {{productInfo.item_name}}
           {{productInfo.seller_sku}}
            {{productInfo.quantity}}
            {{productInfo.price}}

<a type="button" class="full-view text-success"><i id="fullView" data="{{productInfo._id}}" class="fa fa-eye"></i></a>

          {{/each}} 

上記のproductDetailsでわかるように、Htmlでレンダリングするデータを取得するヘルパークラスの関数名には、その名前を介して直接アクセスでき、htmlテンプレートの各ループを介してトラバースできます。

0
Saurabh tiwary