【问题标题】:Meteor accessing helpers from other helpersMeteor 从其他助手访问助手
【发布时间】:2015-01-29 21:36:10
【问题描述】:

我是 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 实际上在这里工作,但我仍然对如何在一般情况下执行此操作感兴趣。

【问题讨论】:

    标签: templates meteor helpers


    【解决方案1】:

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

    一旦在客户端上,您的好友请求助手和您的 hasFriendRequests 都将使用相同的客户端数据。数据实际上被复制到客户端迷你 mongodb 数据库中,该数据库仅订阅了信息。

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

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

    【讨论】:

    • 是的,我可以想象这些优化将为我节省一个查询。但我不想依赖这个我不了解缓存协议的迷你 MongoDB。使用registerHelper(getLength, ...) 注册一个助手并使用{{# if getLength friendRequests}} 在HTML 模板中调用它是正确的做法吗?
    • 我认为通常的做法是在 Minimongo 上进行多次查询 - 通常在前端进行多次查询不会成为您应用的瓶颈。
    • 这很有趣。谢谢!
    猜你喜欢
    • 2013-06-18
    • 2015-03-28
    • 2014-09-26
    • 2016-03-04
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多