流星访问其他助手的助手

时间:2014-12-01 19:38:07

标签: templates meteor helpers

我是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应用于昂贵的帮助程序,这样我就不必重新计算它。所以,如果你能照亮我,那就太棒了!

我能想到的一种方法是将数据放在Session中并在那里工作。这是怎么做的?

任何帮助将不胜感激!

谢谢! 阿林

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

1 个答案:

答案 0 :(得分:0)

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

一旦进入客户端,您的朋友都会请求助手,而您的hasFriendRequests将使用相同的客户端数据。数据实际上被复制到客户端迷你mongodb数据库中,该数据库只有订阅的信息。

所以简短的回答是,只有一个数据库查询,因为流星将为你做所有的魔术。

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