2014-12-01 2 views
0

Я новичок в 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 и работая там. Так ли это должно быть сделано?

Любая помощь будет оценена!

Спасибо! Алинь

Edit: Я понимаю friendRequests.length работы здесь на самом деле, но я по-прежнему заинтересован в том, чтобы сделать это в общем случае.

ответ

0

Хотя это будет в конечном итоге запрос mongodb, вы, скорее всего, настроите этот список запросов друзей как опубликованную коллекцию. В meteor это означает, что эта коллекция копируется по проводу на начальной загрузке страницы и отправляется только один раз.

Однажды на клиенте, как ваш друг просит помощника, так и ваш hasFriendRequests будут использовать эти же данные на стороне клиента. Фактически данные копируются в базу данных mini mongodb на стороне клиента, на которой есть только подписанная информация.

Итак, короткий ответ: для этого будет только один запрос БД, потому что метеорит сделает для вас всю магию.

Ключ будет в настройке публикации и подписки. Предположим, вы только играете в румянец и подписываетесь на него один раз. У вас все настроено.

+0

Да, я могу представить, что эти оптимизаторы сохранят мне запрос. Но я не хочу полагаться на этот мини-MongoDB, чей протокол кеширования я не понимаю. Будет ли регистрировать помощника с помощью 'registerHelper (getLength, ...)' и вызывать его в HTML-шаблоне с помощью '{{# if getLength friendRequests}}' правильного способа сделать это? –

+0

Я думаю, что обычный способ делать такие вещи - это делать несколько запросов на Minimongo - обычно создание нескольких запросов на интерфейсе не будет узким местом для вашего приложения. – stubailo

+0

Это интересно. Спасибо! –