Как сделать функцию, которая использует счетчики для реактивного вычисления значений
Я новичок в метеорите, и я попытался использовать пакет 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
Все, что я могу предложить, - это посмотреть, куда я поместил код (на клиенте или на сервере) - возможно, это как-то связано с этим.
Но, возможно, более вероятно, что вы выполняли неправильные тесты. Другими словами, возможно, вы ошиблись датой - вы думали, что вставляете запись с датой на прошлой неделе, тогда как на самом деле это было две недели назад или что-то в этом роде.