Как сделать функцию, которая использует счетчики для реактивного вычисления значений

Я новичок в метеорите, и я попытался использовать пакет tmeasday: publish-countts для публикации некоторых подсчетов. Реактивность прекрасно работает из коробки, когда я просто читаю счетчики, но когда я использую счетчики в функции Template.helper, функция не обновляется при изменении счетчиков.

Вот что у меня есть:

  • На сервере:

    Meteor.publish('counters', function() {
        Counts.publish(this, 'searches-thisWeek', UserActions.find({
            $and: [
                { action: SEARCHES_REGEX },
                { date : { $gte : moment().startOf('week').toDate()} },
                { date : { $lt : moment().toDate()} }
            ]
        }));
    
        Counts.publish(this, 'searches-lastWeek', UserActions.find({
            $and: [
                { action: SEARCHES_REGEX },
                { date : { $gte :  moment().subtract(1, 'week').startOf('week').toDate()} },
                { date : { $lt :  moment().subtract(1, 'week').endOf('week').toDate()} }
            ]
        }));
    });
    
  • На клиенте:

    Template.dashboard.helpers({
        nbSearchesThisWeek : function() {
            var variation = Counts.get('searches-thisWeek') - Counts.get('searches-lastWeek');
            return {
                currentValue : Counts.get('searches-thisWeek'),
                orientation : {
                    sign: (variation > 0) ? '+' : '',
                    class: (variation > 0) ? 'up' : 'down'
                },
                variation : variation
            };
        }
    });
    
  • В моем шаблоне у меня есть:

    <td>{{getPublishedCount 'searches'}}</td>
    <td>{{#with nbSearchesThisWeek}}{{>variations }}{{/with}}</td>
    
  • Он использует этот подшаблон:

    <template name="variations">
        <div class="variation col-lg-12">
            <span class="variationValue {{orientation.class}} col-lg-6">{{orientation.sign}}{{variation}}</span>
            <span class="currentValue col-lg-6">{{currentValue}}</span>
        </div>
    </template>
    

    {{GetPublishedCount 'search'}} обновляется нормально. Он просто получает мой счетчик "поисков" и обновляется каждый раз, когда счетчик меняется.

Однако счетчики в подшаблоне работают нормально при запуске, но никогда не обновляются при изменении любого из зависимых счетчиков.

Итак, мой вопрос: как и где я могу заставить моего помощника nbSearchesThisWeek реагировать на изменения значений зависимых счетчиков? Я очень смущен, когда читаю документацию о Deps, Tracking и ReactiveVars... Я действительно не понимал, где эти вещи должны использоваться, чтобы заставить мой вариант использования работать...

Спасибо за вашу помощь.

Philippe

1 ответ

Решение

Я создал MeteorPad с кодом, который, насколько это возможно, совпадает с вашим, и все это реагирует без каких-либо изменений в вашем коде.

Обратите внимание, что вместо того, чтобы пытаться воссоздать вашу коллекцию UserActions, я создал две отдельные коллекции: UserActions и Players (имена не имеют значения) для создания двух счетчиков, похожих на вашу. Я думаю, что, увидев код, вы согласитесь с тем, что для проверки кода он подойдет.

Перейдите на эту страницу: http://app-cmrd2ous.meteorpad.com/ откройте консоль Chrome или Firefox и вставьте следующие две записи и просмотрите счетчики:

UserActions.insert({name: 'bloggs', date: new Date()});
Players.insert({name: 'bloggs again', date: new Date()});

Счетчики все реактивные.

Метеорпад находится здесь: http://meteorpad.com/pad/n4GwwtPesEZ9rTSuq/Dashboard

Все, что я могу предложить, - это посмотреть, куда я поместил код (на клиенте или на сервере) - возможно, это как-то связано с этим.

Но, возможно, более вероятно, что вы выполняли неправильные тесты. Другими словами, возможно, вы ошиблись датой - вы думали, что вставляете запись с датой на прошлой неделе, тогда как на самом деле это было две недели назад или что-то в этом роде.

Другие вопросы по тегам