2014-12-01 74 views
0

我是流星及其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工程实际,但我在如何做到这一点在一般情况下仍然有兴趣。

回答

0

尽管这最终会是一个mongodb查询,但您很可能会将此朋友请求列表设置为发布的集合。流星意味着这个集合在初始页面加载时被复制到网络上,并且只发送一次。

一旦在客户端上,你的朋友请求帮助,你的hasFriendRequests将使用这个相同的客户端数据。数据实际上被复制到只有订阅信息的客户端迷你mongodb数据库中。

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

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

+0

是的,我可以想象这些优化会为我节省查询。但我不想依赖这个迷你MongoDB缓存协议,我不明白。使用'registerHelper(getLength,...)'注册一个帮助器并在HTML模板中用'{{if if getLength friendRequests}}'调用它是正确的方法吗? – 2014-12-01 20:09:05

+0

我认为通常做这种事的方法是在Minimongo上进行多个查询 - 通常在前端进行多次查询不会成为您的应用程序的瓶颈。 – stubailo 2014-12-01 20:22:25

+0

这很有趣。谢谢! – 2014-12-02 03:16:47