使用Meteor中的把手进行计算

时间:2015-06-07 14:47:11

标签: javascript meteor handlebars.js

我有upvotes和downvotes,它们都在集合中,并在模板中显示为{{upvotes}}{{downvotes}}

所以,如果我要有一个显示总票数的第三个显示器,我是否应该通过下面的帮助器进行操作(不按顺序工作):

在helper.js中:

Template.registerHelper('totalvotes', function(upvotes, downvotes) {
    var totalvotes = upvotes + downvotes;
    return totalvotes;
});

在html中:

{{ totalvotes "Vote"}}


我记得有关性能的事情而不是计算客户端级别的所有字段。在这种情况下,通过添加totalvotes字段而不是在客户端中拥有帮助程序,在主对象集合中增加是否更好? (包括粗略形式的建议代码)。谢谢!

例如在集合(字段)中:

upvotes: 0 
downvotes: 0 

然后是增量逻辑

$inc: {upvotes: 1}
$inc: {downvotes: 1}

upvotes: 0 
downvotes: 0 
totalvotes: 0

$inc: {upvotes: 1}
$inc: {downvotes: 1}
$inc: {totalvotes: 1}

2 个答案:

答案 0 :(得分:2)

你不应该过于字面意思地接受这个建议,因为这实际上取决于你正在做什么。

对于这个特殊情况,我认为在客户端使用帮助程序进行数学计算要好得多(这只是对帮助程序的额外调用,并且会做一些非常简单的事情处理)而不是在数据库上添加额外的非规范化字段,这会增加更大的总体开销(存储在磁盘,内存空间,网络数据上)。

获取灵感:

"程序员浪费了大量时间来思考或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该在关键的3%中放弃我们的机会。" - 唐纳德克努特

答案 1 :(得分:2)

我同意@dooart的回答。

关于你的助手不工作,我建议在pageSession反应变量中存储upvotes和downvotes(使用reactive-dict)。

这样,您不必将2个参数传递给助手,并且您获得反应性投票计数:您的每个downvotes,upvotes和totalvotes helper只返回相关变量(或者它们在totalvotes中的总和)< / p>