【问题标题】:DRYing up template code in Meteor?在 Meteor 中干燥模板代码?
【发布时间】:2014-08-03 04:06:13
【问题描述】:

在构建我的第一个 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>

计算当前商品的数量似乎相当简单,我提取所有商品,对商品计数求和(使用 d3),然后返回结果。

Template.store.current_items = 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;
  }
  else {
    return 'N/A';
  }
};

要计算允许项目总数和当前项目的百分比,似乎我必须重复所有内容。有没有更好的方法来做到这一点?

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';
  }
};

【问题讨论】:

  • 我不知道流星,用{{current_items / max_items * 100}} 代替{{percent_full}} 可以解决问题吗?

标签: templates meteor


【解决方案1】:

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

【讨论】:

  • Product.find 调用怎么样?有没有办法避免必须这样做两次,一次计算项目数,再次计算百分比?记忆化并不是一个真正的选择,因为产品数量可能会发生变化,并且应该响应式更新。
  • 好吧,你可以在助手之外手动创建一个响应式 Deps.autorun,将总和计算为响应式 var 总和(或者简单地说是 Session),然后依赖于你的助手中的值
  • 您在项目中使用 Iron-Router 吗?如果是这样,将 Product.find 调用放在路由的数据部分可能会更有意义。
  • 在两种方法(Deps.autorun,Iron Router)之间,是否有一个“正确”的地方可以放置这个?我的新手意见倾向于 Deps.autorun,因为当新项目添加到集合时需要重新计算它,并且我假设路由器是在客户端调用的?另一方面,使用一百万个中间值污染会话似乎并不好。
  • 我不认为重新计算这个特定的东西两次会很快受到伤害。不要过早优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多