Meteor在模板助手函数中使用fetch或find?

时间:2013-05-17 05:23:00

标签: mongodb meteor

在流星模板辅助函数中,如果我返回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

2 个答案:

答案 0 :(得分:48)

是的。

通过使用fetch,您可以在现场注册整个查询结果集。通过使用find以及稍后使用{{#each}}进行迭代,将在每个文档上单独注册依赖项。因此,当一个文档发生更改时,只会重新呈现相关代码。使用fetch时,更改结果集中的任何文档都会重新呈现您使用fetch的整个范围。

对于小的结果集,它没有任何区别。对于频繁更改的较大集合,它可能会减慢计算速度并导致不必要的视觉伪影。

我写了一篇post,可以帮助你理解它(虽然它没有直接回答你的问题)

答案 1 :(得分:0)

这就是我们在Oodles Technologies中所遵循的。

对于定义帮助器,只需转到模板js文件,例如,如果你有一个模板名称为allInventory,那么只需转到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模板中的每个循环遍历该函数。