【问题标题】:In Meteor, how can I do a sum of some computed fields in a table?在 Meteor 中,如何对表中的一些计算字段求和?
【发布时间】:2015-05-15 07:20:35
【问题描述】:

这个问题我已经完全重写了,因为我已经取得了一些进展,我还需要进一步澄清它。

一般来说 - 我想计算表格的行和列总计,而不必重新计算每个单元格的值两次。让我解释一下。

我有一个集合,每个文档包含 12 个值。对于每个文档,我需要对这 12 个文档值执行两个缓慢而昂贵的计算,产生两个结果,然后将这两个结果显示在一个表格中。 然后我还需要每一行的两个计算结果的总和,以及每一列的所有计算结果的总和。

页面如下所示:

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(),并且我喜欢只计算每个单元格的值一次,因为我的计算速度很慢。 :)

我能否以某种方式计算列总和,但在我的光标助手中?

或者是否有其他方法可以反应性地获取整个集合并在一次传递中反应性地生成行和和列和?

【问题讨论】:

  • 在您的应用程序中响应式可用?还是只是在这个单一视图中更新?
  • 只有一个视图
  • 我忘了问,vals 是否会被动更新?否则只需使用 jQuery 对模板渲染上的行和列求和。
  • 是的,vals 响应式更新。对于集合中的每个文档,我处理大量字段以生成包含带有 val1 val2 val3 和 vall4 的表的页面。然后不知何故,在 val1 和 val2 反应性变化之后,我喜欢从 vals 重新计算总和。
  • 好吧,这很棘手……我还没有找到适合这种情况的好模式。问题是 DOM 会随着助手响应式更新行和列值而发生变化。跟踪这种变化很困难,我有几个 hacky 解决方案。我认为正确的方法是以某种方式将 ReactiveVar 用于 Tracker,但我从来没有能够让这些工作。另一种可能可行的简单方法是简单地为行和列总计创建一个帮助器,它使用与 val 帮助器相同的逻辑(或共享函数)。

标签: jquery meteor html-table


【解决方案1】:

所以,我相信我有一个答案。至少它似乎有效。

我修改了传递给模板的模板助手,现在看起来像这样

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() 的次数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多