如何制作一个使用计数器来计算值的函数
How to make a function that uses counters to compute values reactively
我是 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 'searches'}} 更新正常。它只是获取我的 "searches" 计数器并在计数器更改时更新。
但是,子模板中的计数器在启动时执行良好,但在任何相关计数器更改时从不更新。
所以我的问题是,如何以及在何处让我的 nbSearchesThisWeek 助手对相关计数器值的变化做出反应?当我阅读有关 Deps、Tracking 和 ReactiveVars 的文档时,我感到非常困惑......我真的不明白应该在哪里使用这些东西来使我的用例工作......
感谢您的帮助。
菲利普
我已经创建了一个 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
我只能建议您查看我放置代码的位置(无论是在客户端还是在服务器上)- 也许这与它有关。
但更有可能是您 运行 进行了错误的测试。换句话说,也许你弄错了日期——你以为你插入的记录是上周的日期,而实际上是两周前或类似的日期。
我是 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 'searches'}} 更新正常。它只是获取我的 "searches" 计数器并在计数器更改时更新。
但是,子模板中的计数器在启动时执行良好,但在任何相关计数器更改时从不更新。
所以我的问题是,如何以及在何处让我的 nbSearchesThisWeek 助手对相关计数器值的变化做出反应?当我阅读有关 Deps、Tracking 和 ReactiveVars 的文档时,我感到非常困惑......我真的不明白应该在哪里使用这些东西来使我的用例工作......
感谢您的帮助。
菲利普
我已经创建了一个 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
我只能建议您查看我放置代码的位置(无论是在客户端还是在服务器上)- 也许这与它有关。
但更有可能是您 运行 进行了错误的测试。换句话说,也许你弄错了日期——你以为你插入的记录是上周的日期,而实际上是两周前或类似的日期。