0

我是流星新手,我尝试使用 tmeasday:publish-counts 包发布一些计数。当我刚刚读取计数时,反应性开箱即用,但是当我在 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 'searches'}} 更新正常。它只是获取我的“搜索”计数器并在计数器更改时更新。

但是,子模板中的计数器在启动时执行良好,但在任何依赖计数器发生更改时从不更新。

所以我的问题是,我如何以及在哪里让我的 nbSearchesThisWeek 助手对依赖计数器值的更改做出反应?当我阅读有关 Deps、Tracking 和 ReactiveVars 的文档时,我感到非常困惑……我真的不明白应该在哪里使用这些东西来使我的用例工作……

谢谢你的帮助。

菲利普

4

1 回答 1

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

我只能建议你看看我把代码放在哪里(无论是在客户端还是服务器上)——也许这与它有关。

但也许更有可能是您运行了错误的测试。换句话说,也许你弄错了日期——你以为你插入的记录是上周的,而实际上它是两周前或类似的。

于 2015-05-18T22:40:42.793 回答