2014-12-01 110 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