在 Meteor 中,如何对 table 中的一些计算字段求和?
In Meteor, how can I do a sum of some computed fields in a table?
我已经完全重写了这个问题,因为我有了一些进展,我还需要进一步澄清。
一般来说 - 我想计算 table 的行和列总数,而不必重新计算每个单元格值两次。让我解释一下。
我有一个集合,每个文档包含 12 个值。对于每个文档,我需要对这 12 个文档值执行两次缓慢而昂贵的计算,从而产生两个结果,然后将这两个结果显示在 table 中。
然后我还需要每一行的两个计算结果的总和,以及每一列的所有计算结果的总和。
页面看起来像这样:
resa resb row1sum
resa resb row2sum
(etc)
col1sum col2sum
模板的一部分可能如下所示:
<table>
{{#each docs}}
<tr><td>{{resa}}</td> <td>{{resb}}</td> <td>{{rowsum}}</td></tr>
{{/each}}
<tr><td>{{colsum1}}</td> <td>{{colsum2}}</td>
</table>
对于每一行,我现在在我的游标助手中使用一个转换子句来生成结果和行总和。
docs: function() {
return myCollection.find({},{transform: function(doc) {
var resa = slowcalculation1(doc);
doc.resa = resa;
var resb = slowcalculation2(doc);
doc.resb = resb;
doc.rowsum = resa+resb;
return doc;
}
});
},
这可以很好地计算每个文档的两个结果和行和,并且是反应式的。
但我现在正试图找到一种有效计算列总和的方法。
我可以使用以下内容
Tracker:autorun(function()
{
var col1tot=0;
var col2tot=0;
myCollection.find().forEach(function(doc) {
var resa = slowcalculation1(doc);
col1tot += resa;
var resb = slowcalculation2(doc);
col2tot += resb;
});
Session.set('col1',col1tot);
Session.set('col2',col2tot);
// then get these coltotals using helpers
});
但是有没有更好的办法呢?目前,为了生成页面,我为每个单元格调用了两次 slowcalculations(),并且我喜欢只计算每个单元格值一次,因为我的计算很慢。 :)
我能否以某种方式计算列总和,但在我的游标助手中?
或者是否有其他方法可以反应性地获取整个集合并在单次传递中反应性地生成行总和和列总和?
所以,我相信我有答案了。至少它似乎有效。
我修改了传递给模板的模板助手,它现在看起来像这样
docs: function() {
var col1sum=0;
var col2sum=0;
return myCollection.find({},{transform: function(doc) {
var resa = slowcalculation1(doc);
doc.resa = resa;
var resb = slowcalculation2(doc);
doc.resb = resb;
doc.rowsum = resa+resb; // the rowsum
col1sum += resa;
col2sum += resb;
Session.set('col1sum',col1sum);
Session.set('col2sum',col2sum);
// then get these colsums into template using helpers
return doc;
}
});
},
这会计算行总和和列总和,从而最大限度地减少 slowcalculations() 的执行次数。
我已经完全重写了这个问题,因为我有了一些进展,我还需要进一步澄清。
一般来说 - 我想计算 table 的行和列总数,而不必重新计算每个单元格值两次。让我解释一下。
我有一个集合,每个文档包含 12 个值。对于每个文档,我需要对这 12 个文档值执行两次缓慢而昂贵的计算,从而产生两个结果,然后将这两个结果显示在 table 中。 然后我还需要每一行的两个计算结果的总和,以及每一列的所有计算结果的总和。
页面看起来像这样:
resa resb row1sum
resa resb row2sum
(etc)
col1sum col2sum
模板的一部分可能如下所示:
<table>
{{#each docs}}
<tr><td>{{resa}}</td> <td>{{resb}}</td> <td>{{rowsum}}</td></tr>
{{/each}}
<tr><td>{{colsum1}}</td> <td>{{colsum2}}</td>
</table>
对于每一行,我现在在我的游标助手中使用一个转换子句来生成结果和行总和。
docs: function() {
return myCollection.find({},{transform: function(doc) {
var resa = slowcalculation1(doc);
doc.resa = resa;
var resb = slowcalculation2(doc);
doc.resb = resb;
doc.rowsum = resa+resb;
return doc;
}
});
},
这可以很好地计算每个文档的两个结果和行和,并且是反应式的。
但我现在正试图找到一种有效计算列总和的方法。
我可以使用以下内容
Tracker:autorun(function()
{
var col1tot=0;
var col2tot=0;
myCollection.find().forEach(function(doc) {
var resa = slowcalculation1(doc);
col1tot += resa;
var resb = slowcalculation2(doc);
col2tot += resb;
});
Session.set('col1',col1tot);
Session.set('col2',col2tot);
// then get these coltotals using helpers
});
但是有没有更好的办法呢?目前,为了生成页面,我为每个单元格调用了两次 slowcalculations(),并且我喜欢只计算每个单元格值一次,因为我的计算很慢。 :)
我能否以某种方式计算列总和,但在我的游标助手中?
或者是否有其他方法可以反应性地获取整个集合并在单次传递中反应性地生成行总和和列总和?
所以,我相信我有答案了。至少它似乎有效。
我修改了传递给模板的模板助手,它现在看起来像这样
docs: function() {
var col1sum=0;
var col2sum=0;
return myCollection.find({},{transform: function(doc) {
var resa = slowcalculation1(doc);
doc.resa = resa;
var resb = slowcalculation2(doc);
doc.resb = resb;
doc.rowsum = resa+resb; // the rowsum
col1sum += resa;
col2sum += resb;
Session.set('col1sum',col1sum);
Session.set('col2sum',col2sum);
// then get these colsums into template using helpers
return doc;
}
});
},
这会计算行总和和列总和,从而最大限度地减少 slowcalculations() 的执行次数。