Templates 在Meteor中干涸模板代码?

Templates 在Meteor中干涸模板代码?,templates,meteor,Templates,Meteor,在构建我的第一个Meteor项目时,我注意到了大量的代码重复,我想知道是否有一种方法可以让它干涸 我的数据库模型有多个存储,每个存储都有多个产品,还有一个包含当前库存量的字段 var store_id = Store.insert({name: 'Store 1', max_items: 50}); var p1 = Product.insert({name: 'General', store_id: store_id, item_count: 20}); var p2 = Product.in

在构建我的第一个Meteor项目时,我注意到了大量的代码重复,我想知道是否有一种方法可以让它干涸

我的数据库模型有多个存储,每个存储都有多个产品,还有一个包含当前库存量的字段

var store_id = Store.insert({name: 'Store 1', max_items: 50});
var p1 = Product.insert({name: 'General', store_id: store_id, item_count: 20});
var p2 = Product.insert({name: 'Special', store_id: store_id, item_count: 10});
我有一个显示商店的模板,以及它有多少产品和物品的统计信息

<template name="store">
  <div class="store">
    <b>{{name}}</b>
    <p>Current items: {{current_items}}</p>
    <p>Maximum # of items allowed in inventory: {{max_items}}</p>
    <p>% Full: {{percent_full}}%</p>
  </div>
</template>
要计算允许项目总数与当前项目的比较百分比,我似乎必须重复所有内容。有更好的方法吗

Template.store.percent_full = function () {
  var store_id = this._id;
  var items = Product.find({store_id: store_id}).fetch();
  if ( items.length > 0 ) {
    var item_cnt = d3.sum(_.pluck(items, 'item_count'));
    return item_cnt / max_items * 100;
  }
  else {
    return 'N/A';
  }
};

将复制的逻辑提取到一个单独的函数中,并从不同的助手中适当地调用它。这与干燥任何其他JS代码没有什么区别。

我不知道meteor,
{current\u items/max\u items*100}}
代替了
{{{percent\u full}
做了这个把戏吗?那产品呢。find调用?有没有办法避免这样做两次,一次是计算项目数量,一次是计算百分比?由于产品计数可能会发生变化,并且应该进行反应性更新,因此备忘录不是一个真正的选项。您可以在助手之外手动创建一个反应性Deps.autorun,将总和计算为总和反应性var(或者简单地说是会话),然后依赖助手中的值。您是否在项目中使用Iron Router?如果是这样的话,将Product.find call放在路由的数据部分可能更有意义。在这两种方法(Deps.autorun、Iron Router)之间,是否有一个“正确”的位置来放置这个?我的新观点倾向于Deps.autorun,因为在向集合添加新项时需要重新计算它,我假设路由器是在客户端调用的?另一方面,用一百万个中间值污染会话似乎不太好。我不认为重新计算这个特定的东西两次会很快造成伤害。不要过早地优化。
Template.store.percent_full = function () {
  var store_id = this._id;
  var items = Product.find({store_id: store_id}).fetch();
  if ( items.length > 0 ) {
    var item_cnt = d3.sum(_.pluck(items, 'item_count'));
    return item_cnt / max_items * 100;
  }
  else {
    return 'N/A';
  }
};