如何创建一个使用计数器来反应计算值的函数

时间:2015-05-15 15:31:12

标签: meteor reactive-programming meteor-publications meteor-collections meteor-react

我是meteor的新手,我尝试使用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'搜索'}}更新正常。它只是得到我的“搜索”计数器,并在计数器发生变化时随时更新。

但是,子模板中的计数器在启动时执行正常,但在任何相关计数器发生更改时永远不会更新。

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

感谢您的帮助。

菲利普

1 个答案:

答案 0 :(得分: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()});

柜台都是被动的。

meteorpad在这里:http://meteorpad.com/pad/n4GwwtPesEZ9rTSuq/Dashboard

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

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