Templates Meteor从其他帮助程序访问帮助程序

Templates Meteor从其他帮助程序访问帮助程序,templates,meteor,helpers,Templates,Meteor,Helpers,我对Meteor及其API/哲学还不熟悉,所以我可能想得不对 我想在页面或消息上显示一些新朋友请求(如果没有)。下面是一些代码: // addfriend.js Template.friendRequests.helpers({ friendRequests: function () { return [ { username: 'alice' }, { username: 'carl' }, { username: 'eve' }, ];

我对Meteor及其API/哲学还不熟悉,所以我可能想得不对

我想在页面或消息上显示一些新朋友请求(如果没有)。下面是一些代码:

// addfriend.js
Template.friendRequests.helpers({
  friendRequests: function () {
    return [
      { username: 'alice' },
      { username: 'carl' },
      { username: 'eve' },
    ];
  },

  hasFriendRequests: function () {
    var template = Template.instance();
    return template.helpers.friendRequests.length > 0;
    }
});

// addfriend.html
<template name="friendRequests">
  <h2>Friend requests</h2>
  {{#if hasFriendRequests}}
    <p>Someone's popular today!</p>
    <ul>
    {{#each friendRequests}}
      <li>{{username}}</li>
    {{/each}}
    </ul>
  {{else}}
    <p>Sorry, nobody likes you right now.</p>
  {{/if}}
</template>
我的问题是friendRequests最终将是一个MongoDB查询,我希望hasFriendRequests不要重复该查询。我只想让它作用于friendRequests助手。但我上面的代码并不适用于此

更一般地说,我感兴趣的是能够将任何函数f应用于昂贵的助手,这样我就不必重新计算它。如果你能照亮我,那就太棒了

我可以想到的一种方法是将数据放在会话中,然后从会话开始工作。应该这样做吗

任何帮助都将不胜感激

谢谢! 阿林


编辑:我意识到friendRequests.length实际上在这里起作用,但我仍然对如何在一般情况下做到这一点感兴趣。

虽然这最终将是一个mongodb查询,但您很可能会将此好友请求列表设置为一个已发布的集合。在meteor中,这意味着此集合在初始页面加载时通过网络进行复制,并且只发送一次

一旦进入客户端,您的friend requests助手和hasFriendRequests都将使用相同的客户端数据。数据实际上被复制到客户端mini-mongodb数据库中,该数据库只订阅了信息

所以简单的回答是,对于这个问题,只有一个DB查询,因为meteor将为您带来所有的魔力


关键在于设置您的发布和订阅。所以假设你只玩腮红并订阅一次。你们都准备好了

是的,我可以想象这些优化将为我节省一个查询。但我不想依赖这个小型MongoDB,我不了解它的缓存协议。将帮助程序注册为RegisterHelpGetLength。。。用{if getLength friendRequests}在HTML模板中调用它是正确的方法吗?我认为通常的做法是在Minimongo上进行多次查询-通常在前端进行多次查询不会成为应用程序的瓶颈。这很有趣。非常感谢。