使用 Meteor 模板助手返回的值进行其他计算 [解决聚合问题]
Using values returned by Meteor template helpers for other calculations [SOLVING WITH AGGREGATION]
我无法理解如何 运行 在 Meteor 应用程序中进行一些简单的计算。
下面的帮手return三个值(分子、分母和两者相除的结果)。前两个值当前来自一个集合(最终将来自 API 提要)并且依赖于来自不同集合的两个值(使用 Template.parentData 调用)。第三个值没有保存到数据库中。通过循环重复此序列以在 table.
中显示三个值
Template.ValuationTable.helpers({
selections: function () {
var selected = this.valuationSelections;
return Companies.find({ticker: {$in: selected}})
},
valuationNum: function() {
var valuationMetric = Template.parentData(1).valuationMetric;
switch (valuationMetric) {
case "EV/Revenue":
return this.enterpriseValue.toFixed(1);
break;
case "EV/EBITDA":
return this.enterpriseValue.toFixed(1);
break;
default:
return "";
}
},
valuationDen: function() {
var valuationMetric = Template.parentData(1).valuationMetric;
var valuationPeriod = Template.parentData(1).valuationPeriod;
switch (valuationMetric) {
case "EV/Revenue":
switch (valuationPeriod) {
case "LTM":
return this.ltm.revenue.toFixed(1);
break;
case "FY1":
return this.fy1.revenue.toFixed(1);
break;
case "FY2":
return this.fy2.revenue.toFixed(1);
break;
}
break;
case "EV/EBITDA":
switch (valuationPeriod) {
case "LTM":
return this.ltm.ebitda.toFixed(1);
break;
case "FY1":
return this.fy1.ebitda.toFixed(1);
break;
case "FY2":
return this.fy2.ebitda.toFixed(1);
break;
}
break;
default:
return "";
}
}
});
Template.registerHelper('divide', function(a, b) {
return (a / b).toFixed(1);
});
<template name="ValuationTable">
{{#each selections}}
<tr>
<td>
<a>${{valuationNum}}</a>
</td>
<td>
<a>${{valuationDen}}</a>
</td>
<td>
<a>{{divide valuationNum valuationDen}}x</a>
</td>
</tr>
{{/each}}
</template>
然后我需要计算第三个值系列的平均值和中值,既要显示在页面上又要用作 D3 的数据点。我知道我需要数组中的这些值来计算平均值和中位数,但我不知道如何从辅助结果中 "get" 它们。
首先,我是否应该在对象中构建开关(也许在订阅中?)并将其传递给助手?如果是这样,将不胜感激。
其次,如何获取第三个值添加到数组中?我可以直接从助手访问它吗?
提前致谢,抱歉,如果这是两个不同的问题,但我认为它们密切相关。
编辑:
我意识到,根据 Michel 对 meteorhacks:aggregate
的建议,我的想法是错误的,需要的是聚合,而不是助手。
在处理单个文档的辅助函数中执行聚合操作是不切实际的。您可能会找到诸如 meteorhacks:aggregate 之类的包来实现聚合功能。
为什么不切实际?对于初学者来说,由于反应性,任何值甚至文档数量都可能随时发生变化。您无法真正执行聚合 ,因为文档显示 在具有一个文档范围的函数中。
我无法理解如何 运行 在 Meteor 应用程序中进行一些简单的计算。
下面的帮手return三个值(分子、分母和两者相除的结果)。前两个值当前来自一个集合(最终将来自 API 提要)并且依赖于来自不同集合的两个值(使用 Template.parentData 调用)。第三个值没有保存到数据库中。通过循环重复此序列以在 table.
中显示三个值Template.ValuationTable.helpers({
selections: function () {
var selected = this.valuationSelections;
return Companies.find({ticker: {$in: selected}})
},
valuationNum: function() {
var valuationMetric = Template.parentData(1).valuationMetric;
switch (valuationMetric) {
case "EV/Revenue":
return this.enterpriseValue.toFixed(1);
break;
case "EV/EBITDA":
return this.enterpriseValue.toFixed(1);
break;
default:
return "";
}
},
valuationDen: function() {
var valuationMetric = Template.parentData(1).valuationMetric;
var valuationPeriod = Template.parentData(1).valuationPeriod;
switch (valuationMetric) {
case "EV/Revenue":
switch (valuationPeriod) {
case "LTM":
return this.ltm.revenue.toFixed(1);
break;
case "FY1":
return this.fy1.revenue.toFixed(1);
break;
case "FY2":
return this.fy2.revenue.toFixed(1);
break;
}
break;
case "EV/EBITDA":
switch (valuationPeriod) {
case "LTM":
return this.ltm.ebitda.toFixed(1);
break;
case "FY1":
return this.fy1.ebitda.toFixed(1);
break;
case "FY2":
return this.fy2.ebitda.toFixed(1);
break;
}
break;
default:
return "";
}
}
});
Template.registerHelper('divide', function(a, b) {
return (a / b).toFixed(1);
});
<template name="ValuationTable">
{{#each selections}}
<tr>
<td>
<a>${{valuationNum}}</a>
</td>
<td>
<a>${{valuationDen}}</a>
</td>
<td>
<a>{{divide valuationNum valuationDen}}x</a>
</td>
</tr>
{{/each}}
</template>
然后我需要计算第三个值系列的平均值和中值,既要显示在页面上又要用作 D3 的数据点。我知道我需要数组中的这些值来计算平均值和中位数,但我不知道如何从辅助结果中 "get" 它们。
首先,我是否应该在对象中构建开关(也许在订阅中?)并将其传递给助手?如果是这样,将不胜感激。
其次,如何获取第三个值添加到数组中?我可以直接从助手访问它吗?
提前致谢,抱歉,如果这是两个不同的问题,但我认为它们密切相关。
编辑:
我意识到,根据 Michel 对 meteorhacks:aggregate
的建议,我的想法是错误的,需要的是聚合,而不是助手。
在处理单个文档的辅助函数中执行聚合操作是不切实际的。您可能会找到诸如 meteorhacks:aggregate 之类的包来实现聚合功能。
为什么不切实际?对于初学者来说,由于反应性,任何值甚至文档数量都可能随时发生变化。您无法真正执行聚合 ,因为文档显示 在具有一个文档范围的函数中。